aboutsummaryrefslogtreecommitdiff
path: root/lib/Frontend/PCHReaderDecl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Frontend/PCHReaderDecl.cpp')
-rw-r--r--lib/Frontend/PCHReaderDecl.cpp46
1 files changed, 20 insertions, 26 deletions
diff --git a/lib/Frontend/PCHReaderDecl.cpp b/lib/Frontend/PCHReaderDecl.cpp
index 8b01d3dd1d..dd2d2825f8 100644
--- a/lib/Frontend/PCHReaderDecl.cpp
+++ b/lib/Frontend/PCHReaderDecl.cpp
@@ -873,36 +873,15 @@ void PCHDeclReader::VisitClassTemplateDecl(ClassTemplateDecl *D) {
if (PrevDecl == 0) {
// This ClassTemplateDecl owns a CommonPtr; read it.
+ // FoldingSets are filled in VisitClassTemplateSpecializationDecl.
unsigned size = Record[Idx++];
- while (size--) {
- ClassTemplateSpecializationDecl *CTSD
- = cast<ClassTemplateSpecializationDecl>(Reader.GetDecl(Record[Idx++]));
- llvm::SmallVector<TemplateArgument, 8> TemplArgs;
- Reader.ReadTemplateArgumentList(TemplArgs, Record, Idx);
- llvm::FoldingSetNodeID ID;
- void *InsertPos = 0;
- ClassTemplateSpecializationDecl::Profile(ID, TemplArgs.data(),
- TemplArgs.size(),
- *Reader.getContext());
- D->getSpecializations().FindNodeOrInsertPos(ID, InsertPos);
- D->getSpecializations().InsertNode(CTSD, InsertPos);
- }
+ while (size--)
+ cast<ClassTemplateSpecializationDecl>(Reader.GetDecl(Record[Idx++]));
size = Record[Idx++];
- while (size--) {
- ClassTemplatePartialSpecializationDecl *CTSD
- = cast<ClassTemplatePartialSpecializationDecl>(
+ while (size--)
+ cast<ClassTemplatePartialSpecializationDecl>(
Reader.GetDecl(Record[Idx++]));
- llvm::SmallVector<TemplateArgument, 8> TemplArgs;
- Reader.ReadTemplateArgumentList(TemplArgs, Record, Idx);
- llvm::FoldingSetNodeID ID;
- void *InsertPos = 0;
- ClassTemplatePartialSpecializationDecl::Profile(ID, TemplArgs.data(),
- TemplArgs.size(),
- *Reader.getContext());
- D->getPartialSpecializations().FindNodeOrInsertPos(ID, InsertPos);
- D->getPartialSpecializations().InsertNode(CTSD, InsertPos);
- }
// InjectedClassNameType is computed.
@@ -944,6 +923,21 @@ void PCHDeclReader::VisitClassTemplateSpecializationDecl(
if (POI.isValid())
D->setPointOfInstantiation(POI);
D->setSpecializationKind((TemplateSpecializationKind)Record[Idx++]);
+
+ if (Record[Idx++]) { // IsKeptInFoldingSet.
+ ClassTemplateDecl *CanonPattern
+ = cast<ClassTemplateDecl>(Reader.GetDecl(Record[Idx++]));
+ if (ClassTemplatePartialSpecializationDecl *Partial
+ = dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) {
+ ClassTemplatePartialSpecializationDecl *Inserted
+ = CanonPattern->getPartialSpecializations().GetOrInsertNode(Partial);
+ assert(Inserted == Partial && "Already inserted!");
+ } else {
+ ClassTemplateSpecializationDecl *Inserted
+ = CanonPattern->getSpecializations().GetOrInsertNode(D);
+ assert(Inserted == D && "Already inserted!");
+ }
+ }
}
void PCHDeclReader::VisitClassTemplatePartialSpecializationDecl(