diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-06-23 13:48:30 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-06-23 13:48:30 +0000 |
commit | dd41c14bfd7686b556de2acf6952e21a4f80b7aa (patch) | |
tree | 2436e7d72fc30542e15e7bd92c027037b59e9396 /lib/Frontend/PCHWriterDecl.cpp | |
parent | 94d228d3454a3f6436526d15b2ad7fc90246fe54 (diff) |
Support C++ class template specializations and partial specializations for PCH.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@106625 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/PCHWriterDecl.cpp')
-rw-r--r-- | lib/Frontend/PCHWriterDecl.cpp | 62 |
1 files changed, 44 insertions, 18 deletions
diff --git a/lib/Frontend/PCHWriterDecl.cpp b/lib/Frontend/PCHWriterDecl.cpp index 9cc7b4833d..ade7508fd4 100644 --- a/lib/Frontend/PCHWriterDecl.cpp +++ b/lib/Frontend/PCHWriterDecl.cpp @@ -244,10 +244,7 @@ void PCHDeclWriter::VisitFunctionDecl(FunctionDecl *D) { Record.push_back(FTSInfo->getTemplateSpecializationKind()); // Template arguments. - assert(FTSInfo->TemplateArguments && "No template args!"); - Record.push_back(FTSInfo->TemplateArguments->flat_size()); - for (int i=0, e = FTSInfo->TemplateArguments->flat_size(); i != e; ++i) - Writer.AddTemplateArgument(FTSInfo->TemplateArguments->get(i), Record); + Writer.AddTemplateArgumentList(FTSInfo->TemplateArguments, Record); // Template args as written. if (FTSInfo->TemplateArgumentsAsWritten) { @@ -705,18 +702,7 @@ void PCHDeclWriter::VisitTemplateDecl(TemplateDecl *D) { VisitNamedDecl(D); Writer.AddDeclRef(D->getTemplatedDecl(), Record); - { - // TemplateParams. - TemplateParameterList *TPL = D->getTemplateParameters(); - assert(TPL && "No TemplateParameters!"); - Writer.AddSourceLocation(TPL->getTemplateLoc(), Record); - Writer.AddSourceLocation(TPL->getLAngleLoc(), Record); - Writer.AddSourceLocation(TPL->getRAngleLoc(), Record); - Record.push_back(TPL->size()); - for (TemplateParameterList::iterator P = TPL->begin(), PEnd = TPL->end(); - P != PEnd; ++P) - Writer.AddDeclRef(*P, Record); - } + Writer.AddTemplateParameterList(D->getTemplateParameters(), Record); } void PCHDeclWriter::VisitClassTemplateDecl(ClassTemplateDecl *D) { @@ -749,12 +735,52 @@ void PCHDeclWriter::VisitClassTemplateDecl(ClassTemplateDecl *D) { void PCHDeclWriter::VisitClassTemplateSpecializationDecl( ClassTemplateSpecializationDecl *D) { - assert(false && "cannot write ClassTemplateSpecializationDecl"); + VisitCXXRecordDecl(D); + + llvm::PointerUnion<ClassTemplateDecl *, + ClassTemplatePartialSpecializationDecl *> InstFrom + = D->getSpecializedTemplateOrPartial(); + if (InstFrom.is<ClassTemplateDecl *>()) { + Writer.AddDeclRef(InstFrom.get<ClassTemplateDecl *>(), Record); + } else { + Writer.AddDeclRef(InstFrom.get<ClassTemplatePartialSpecializationDecl *>(), + Record); + Writer.AddTemplateArgumentList(&D->getTemplateInstantiationArgs(), Record); + } + + // Explicit info. + Writer.AddTypeSourceInfo(D->getTypeAsWritten(), Record); + if (D->getTypeAsWritten()) { + Writer.AddSourceLocation(D->getExternLoc(), Record); + Writer.AddSourceLocation(D->getTemplateKeywordLoc(), Record); + } + + Writer.AddTemplateArgumentList(&D->getTemplateArgs(), Record); + Writer.AddSourceLocation(D->getPointOfInstantiation(), Record); + Record.push_back(D->getSpecializationKind()); + + Code = pch::DECL_CLASS_TEMPLATE_SPECIALIZATION; } void PCHDeclWriter::VisitClassTemplatePartialSpecializationDecl( ClassTemplatePartialSpecializationDecl *D) { - assert(false && "cannot write ClassTemplatePartialSpecializationDecl"); + VisitClassTemplateSpecializationDecl(D); + + Writer.AddTemplateParameterList(D->getTemplateParameters(), Record); + + Record.push_back(D->getNumTemplateArgsAsWritten()); + for (int i = 0, e = D->getNumTemplateArgsAsWritten(); i != e; ++i) + Writer.AddTemplateArgumentLoc(D->getTemplateArgsAsWritten()[i], Record); + + Record.push_back(D->getSequenceNumber()); + + // These are read/set from/to the first declaration. + if (D->getPreviousDeclaration() == 0) { + Writer.AddDeclRef(D->getInstantiatedFromMember(), Record); + Record.push_back(D->isMemberSpecialization()); + } + + Code = pch::DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION; } void PCHDeclWriter::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) { |