aboutsummaryrefslogtreecommitdiff
path: root/lib/Frontend/PCHWriterDecl.cpp
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2010-06-23 13:48:30 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2010-06-23 13:48:30 +0000
commitdd41c14bfd7686b556de2acf6952e21a4f80b7aa (patch)
tree2436e7d72fc30542e15e7bd92c027037b59e9396 /lib/Frontend/PCHWriterDecl.cpp
parent94d228d3454a3f6436526d15b2ad7fc90246fe54 (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.cpp62
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) {