aboutsummaryrefslogtreecommitdiff
path: root/lib/Frontend/PCHReader.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/PCHReader.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/PCHReader.cpp')
-rw-r--r--lib/Frontend/PCHReader.cpp36
1 files changed, 31 insertions, 5 deletions
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp
index 97c4d380eb..1f40781377 100644
--- a/lib/Frontend/PCHReader.cpp
+++ b/lib/Frontend/PCHReader.cpp
@@ -2220,13 +2220,11 @@ QualType PCHReader::ReadTypeRecord(uint64_t Offset) {
case pch::TYPE_TEMPLATE_SPECIALIZATION: {
unsigned Idx = 0;
TemplateName Name = ReadTemplateName(Record, Idx);
- unsigned NumArgs = Record[Idx++];
llvm::SmallVector<TemplateArgument, 8> Args;
- Args.reserve(NumArgs);
- while (NumArgs--)
- Args.push_back(ReadTemplateArgument(Record, Idx));
+ ReadTemplateArgumentList(Args, Record, Idx);
+ QualType Canon = GetType(Record[Idx++]);
return Context->getTemplateSpecializationType(Name, Args.data(),Args.size(),
- QualType());
+ Canon);
}
}
// Suppress a GCC warning
@@ -3020,6 +3018,34 @@ PCHReader::ReadTemplateArgument(const RecordData &Record, unsigned &Idx) {
return TemplateArgument();
}
+TemplateParameterList *
+PCHReader::ReadTemplateParameterList(const RecordData &Record, unsigned &Idx) {
+ SourceLocation TemplateLoc = ReadSourceLocation(Record, Idx);
+ SourceLocation LAngleLoc = ReadSourceLocation(Record, Idx);
+ SourceLocation RAngleLoc = ReadSourceLocation(Record, Idx);
+
+ unsigned NumParams = Record[Idx++];
+ llvm::SmallVector<NamedDecl *, 16> Params;
+ Params.reserve(NumParams);
+ while (NumParams--)
+ Params.push_back(cast<NamedDecl>(GetDecl(Record[Idx++])));
+
+ TemplateParameterList* TemplateParams =
+ TemplateParameterList::Create(*Context, TemplateLoc, LAngleLoc,
+ Params.data(), Params.size(), RAngleLoc);
+ return TemplateParams;
+}
+
+void
+PCHReader::
+ReadTemplateArgumentList(llvm::SmallVector<TemplateArgument, 8> &TemplArgs,
+ const RecordData &Record, unsigned &Idx) {
+ unsigned NumTemplateArgs = Record[Idx++];
+ TemplArgs.reserve(NumTemplateArgs);
+ while (NumTemplateArgs--)
+ TemplArgs.push_back(ReadTemplateArgument(Record, Idx));
+}
+
NestedNameSpecifier *
PCHReader::ReadNestedNameSpecifier(const RecordData &Record, unsigned &Idx) {
unsigned N = Record[Idx++];