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/PCHWriter.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/PCHWriter.cpp')
-rw-r--r-- | lib/Frontend/PCHWriter.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/lib/Frontend/PCHWriter.cpp b/lib/Frontend/PCHWriter.cpp index a55684a29a..77356ccd10 100644 --- a/lib/Frontend/PCHWriter.cpp +++ b/lib/Frontend/PCHWriter.cpp @@ -223,6 +223,8 @@ PCHTypeWriter::VisitTemplateSpecializationType( for (TemplateSpecializationType::iterator ArgI = T->begin(), ArgE = T->end(); ArgI != ArgE; ++ArgI) Writer.AddTemplateArgument(*ArgI, Record); + QualType Canon = T->getCanonicalTypeInternal(); + Writer.AddTypeRef(Canon.getTypePtr() != T ? Canon : QualType(), Record); Code = pch::TYPE_TEMPLATE_SPECIALIZATION; } @@ -2572,3 +2574,27 @@ void PCHWriter::AddTemplateArgument(const TemplateArgument &Arg, break; } } + +void +PCHWriter::AddTemplateParameterList(const TemplateParameterList *TemplateParams, + RecordData &Record) { + assert(TemplateParams && "No TemplateParams!"); + AddSourceLocation(TemplateParams->getTemplateLoc(), Record); + AddSourceLocation(TemplateParams->getLAngleLoc(), Record); + AddSourceLocation(TemplateParams->getRAngleLoc(), Record); + Record.push_back(TemplateParams->size()); + for (TemplateParameterList::const_iterator + P = TemplateParams->begin(), PEnd = TemplateParams->end(); + P != PEnd; ++P) + AddDeclRef(*P, Record); +} + +/// \brief Emit a template argument list. +void +PCHWriter::AddTemplateArgumentList(const TemplateArgumentList *TemplateArgs, + RecordData &Record) { + assert(TemplateArgs && "No TemplateArgs!"); + Record.push_back(TemplateArgs->flat_size()); + for (int i=0, e = TemplateArgs->flat_size(); i != e; ++i) + AddTemplateArgument(TemplateArgs->get(i), Record); +} |