aboutsummaryrefslogtreecommitdiff
path: root/lib/Frontend/PCHReaderDecl.cpp
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2010-06-19 19:29:09 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2010-06-19 19:29:09 +0000
commit8731ca76acf81826df7048bffd0c44c7c0f96c7f (patch)
tree48f38b856cd727a0a637822a83883614e8e823a6 /lib/Frontend/PCHReaderDecl.cpp
parent90b715e0df34eae2b50b9b43ec60828ed31dcf94 (diff)
Initial support for reading templates from PCH.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@106392 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/PCHReaderDecl.cpp')
-rw-r--r--lib/Frontend/PCHReaderDecl.cpp104
1 files changed, 99 insertions, 5 deletions
diff --git a/lib/Frontend/PCHReaderDecl.cpp b/lib/Frontend/PCHReaderDecl.cpp
index cbc0da673c..fe11ca76d3 100644
--- a/lib/Frontend/PCHReaderDecl.cpp
+++ b/lib/Frontend/PCHReaderDecl.cpp
@@ -567,6 +567,28 @@ CXXBaseSpecifier *PCHDeclReader::ReadCXXBaseSpecifier() {
void PCHDeclReader::VisitCXXRecordDecl(CXXRecordDecl *D) {
// assert(false && "cannot read CXXRecordDecl");
VisitRecordDecl(D);
+
+ enum CXXRecKind {
+ CXXRecNotTemplate = 0, CXXRecTemplate, CXXRecMemberSpecialization
+ };
+ switch ((CXXRecKind)Record[Idx++]) {
+ default:
+ assert(false && "Out of sync with PCHDeclWriter::VisitCXXRecordDecl?");
+ case CXXRecNotTemplate:
+ break;
+ case CXXRecTemplate:
+ D->setDescribedClassTemplate(
+ cast<ClassTemplateDecl>(Reader.GetDecl(Record[Idx++])));
+ break;
+ case CXXRecMemberSpecialization: {
+ CXXRecordDecl *RD = cast<CXXRecordDecl>(Reader.GetDecl(Record[Idx++]));
+ TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++];
+ SourceLocation POI = Reader.ReadSourceLocation(Record, Idx);
+ D->setInstantiationOfMemberClass(RD, TSK);
+ D->getMemberSpecializationInfo()->setPointOfInstantiation(POI);
+ break;
+ }
+ }
// FIXME: this is far from complete
@@ -618,11 +640,76 @@ void PCHDeclReader::VisitFriendTemplateDecl(FriendTemplateDecl *D) {
}
void PCHDeclReader::VisitTemplateDecl(TemplateDecl *D) {
- assert(false && "cannot read TemplateDecl");
+ VisitNamedDecl(D);
+
+ NamedDecl *TemplatedDecl = cast<NamedDecl>(Reader.GetDecl(Record[Idx++]));
+
+ // TemplateParams.
+ SourceLocation TemplateLoc = Reader.ReadSourceLocation(Record, Idx);
+ SourceLocation LAngleLoc = Reader.ReadSourceLocation(Record, Idx);
+ SourceLocation RAngleLoc = Reader.ReadSourceLocation(Record, Idx);
+
+ unsigned NumParams = Record[Idx++];
+ assert(NumParams && "No template params!");
+ llvm::SmallVector<NamedDecl *, 16> Params;
+ Params.reserve(NumParams);
+ while (NumParams--)
+ Params.push_back(cast<NamedDecl>(Reader.GetDecl(Record[Idx++])));
+
+ TemplateParameterList* TemplateParams =
+ TemplateParameterList::Create(*Reader.getContext(), TemplateLoc, LAngleLoc,
+ Params.data(), Params.size(), RAngleLoc);
+
+ D->init(TemplatedDecl, TemplateParams);
}
void PCHDeclReader::VisitClassTemplateDecl(ClassTemplateDecl *D) {
- assert(false && "cannot read ClassTemplateDecl");
+ VisitTemplateDecl(D);
+
+ ClassTemplateDecl *PrevDecl =
+ cast_or_null<ClassTemplateDecl>(Reader.GetDecl(Record[Idx++]));
+ D->initPreviousDeclaration(*Reader.getContext(), PrevDecl);
+ if (PrevDecl == 0) {
+ // This ClassTemplateDecl owns a CommonPtr; read it.
+
+ unsigned size = Record[Idx++];
+ while (size--) {
+ ClassTemplateSpecializationDecl *CTSD
+ = cast<ClassTemplateSpecializationDecl>(Reader.GetDecl(Record[Idx++]));
+ llvm::FoldingSetNodeID ID;
+ void *InsertPos = 0;
+ ClassTemplateSpecializationDecl::Profile(ID,
+ CTSD->getTemplateArgs().getFlatArgumentList(),
+ CTSD->getTemplateArgs().flat_size(),
+ *Reader.getContext());
+ D->getSpecializations().FindNodeOrInsertPos(ID, InsertPos);
+ D->getSpecializations().InsertNode(CTSD, InsertPos);
+ }
+
+ size = Record[Idx++];
+ while (size--) {
+ ClassTemplatePartialSpecializationDecl *CTSD
+ = cast<ClassTemplatePartialSpecializationDecl>(
+ Reader.GetDecl(Record[Idx++]));
+ llvm::FoldingSetNodeID ID;
+ void *InsertPos = 0;
+ ClassTemplatePartialSpecializationDecl::Profile(ID,
+ CTSD->getTemplateArgs().getFlatArgumentList(),
+ CTSD->getTemplateArgs().flat_size(),
+ *Reader.getContext());
+ D->getPartialSpecializations().FindNodeOrInsertPos(ID, InsertPos);
+ D->getPartialSpecializations().InsertNode(CTSD, InsertPos);
+ }
+
+ // InjectedClassNameType is computed.
+
+ if (ClassTemplateDecl *CTD
+ = cast_or_null<ClassTemplateDecl>(Reader.GetDecl(Record[Idx++]))) {
+ D->setInstantiatedFromMemberTemplate(CTD);
+ if (Record[Idx++])
+ D->setMemberSpecialization();
+ }
+ }
}
void PCHDeclReader::VisitClassTemplateSpecializationDecl(
@@ -640,7 +727,14 @@ void PCHDeclReader::visitFunctionTemplateDecl(FunctionTemplateDecl *D) {
}
void PCHDeclReader::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
- assert(false && "cannot read TemplateTypeParmDecl");
+ VisitTypeDecl(D);
+
+ D->setDeclaredWithTypename(Record[Idx++]);
+ D->setParameterPack(Record[Idx++]);
+
+ bool Inherited = Record[Idx++];
+ TypeSourceInfo *DefArg = Reader.GetTypeSourceInfo(Record, Idx);
+ D->setDefaultArgument(DefArg, Inherited);
}
void PCHDeclReader::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
@@ -988,7 +1082,7 @@ Decl *PCHReader::ReadDeclRecord(uint64_t Offset, unsigned Index) {
assert(false && "cannot read FriendTemplateDecl");
break;
case pch::DECL_CLASS_TEMPLATE:
- assert(false && "cannot read ClassTemplateDecl");
+ D = ClassTemplateDecl::CreateEmpty(*Context);
break;
case pch::DECL_CLASS_TEMPLATE_SPECIALIZATION:
assert(false && "cannot read ClasstemplateSpecializationDecl");
@@ -1000,7 +1094,7 @@ Decl *PCHReader::ReadDeclRecord(uint64_t Offset, unsigned Index) {
assert(false && "cannot read FunctionTemplateDecl");
break;
case pch::DECL_TEMPLATE_TYPE_PARM:
- assert(false && "cannot read TemplateTypeParmDecl");
+ D = TemplateTypeParmDecl::Create(*Context, 0, SourceLocation(), 0,0,0,0,0);
break;
case pch::DECL_NON_TYPE_TEMPLATE_PARM:
assert(false && "cannot read NonTypeTemplateParmDecl");