summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Serialization/ASTReader.cpp7
-rw-r--r--clang/lib/Serialization/ASTReaderDecl.cpp14
2 files changed, 21 insertions, 0 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp
index 46448fff0c9..9acc759fc94 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -1972,6 +1972,13 @@ ASTReader::ReadASTBlock(PerFileData &F) {
std::make_pair(&F, Record[I+1]);
break;
}
+
+ case ADDITIONAL_TEMPLATE_SPECIALIZATIONS: {
+ AdditionalTemplateSpecializations &ATS =
+ AdditionalTemplateSpecializationsPending[Record[0]];
+ ATS.insert(ATS.end(), Record.begin()+1, Record.end());
+ break;
+ }
}
First = false;
}
diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp
index d2fb408e56c..d5649ad7be0 100644
--- a/clang/lib/Serialization/ASTReaderDecl.cpp
+++ b/clang/lib/Serialization/ASTReaderDecl.cpp
@@ -1424,6 +1424,20 @@ Decl *ASTReader::ReadDeclRecord(unsigned Index, DeclID ID) {
}
}
}
+
+ // If this is a template, read additional specializations that may be in a
+ // different part of the chain.
+ if (isa<RedeclarableTemplateDecl>(D)) {
+ AdditionalTemplateSpecializationsMap::iterator F =
+ AdditionalTemplateSpecializationsPending.find(ID);
+ if (F != AdditionalTemplateSpecializationsPending.end()) {
+ for (AdditionalTemplateSpecializations::iterator I = F->second.begin(),
+ E = F->second.end();
+ I != E; ++I)
+ GetDecl(*I);
+ AdditionalTemplateSpecializationsPending.erase(F);
+ }
+ }
assert(Idx == Record.size());
// If we have deserialized a declaration that has a definition the
OpenPOWER on IntegriCloud