Support DependentTemplateSpecializationType and ElaboratedType for PCH.
llvm-svn: 106858
This commit is contained in:
parent
dc9ca0afa8
commit
f0f7a792d7
|
@ -422,8 +422,10 @@ namespace clang {
|
|||
TYPE_TEMPLATE_TYPE_PARM = 29,
|
||||
/// \brief An TemplateSpecializationType record.
|
||||
TYPE_TEMPLATE_SPECIALIZATION = 30,
|
||||
/// \brief An DependentNameType record.
|
||||
TYPE_DEPENDENT_NAME = 31
|
||||
/// \brief A DependentNameType record.
|
||||
TYPE_DEPENDENT_NAME = 31,
|
||||
/// \brief A DependentTemplateSpecializationType record.
|
||||
TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION = 32
|
||||
};
|
||||
|
||||
/// \brief The type IDs for special types constructed by semantic
|
||||
|
|
|
@ -2160,15 +2160,11 @@ QualType PCHReader::ReadTypeRecord(uint64_t Offset) {
|
|||
return Context->getTypeDeclType(cast<EnumDecl>(GetDecl(Record[0])));
|
||||
|
||||
case pch::TYPE_ELABORATED: {
|
||||
if (Record.size() != 2) {
|
||||
Error("incorrect encoding of elaborated type");
|
||||
return QualType();
|
||||
}
|
||||
unsigned Tag = Record[1];
|
||||
// FIXME: Deserialize the qualifier (C++ only)
|
||||
return Context->getElaboratedType((ElaboratedTypeKeyword) Tag,
|
||||
/* NNS */ 0,
|
||||
GetType(Record[0]));
|
||||
unsigned Idx = 0;
|
||||
ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
|
||||
NestedNameSpecifier *NNS = ReadNestedNameSpecifier(Record, Idx);
|
||||
QualType NamedType = GetType(Record[Idx++]);
|
||||
return Context->getElaboratedType(Keyword, NNS, NamedType);
|
||||
}
|
||||
|
||||
case pch::TYPE_OBJC_INTERFACE: {
|
||||
|
@ -2224,6 +2220,20 @@ QualType PCHReader::ReadTypeRecord(uint64_t Offset) {
|
|||
const IdentifierInfo *Name = this->GetIdentifierInfo(Record, Idx);
|
||||
return Context->getDependentNameType(Keyword, NNS, Name, QualType());
|
||||
}
|
||||
|
||||
case pch::TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
|
||||
unsigned Idx = 0;
|
||||
ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
|
||||
NestedNameSpecifier *NNS = ReadNestedNameSpecifier(Record, Idx);
|
||||
const IdentifierInfo *Name = this->GetIdentifierInfo(Record, Idx);
|
||||
unsigned NumArgs = Record[Idx++];
|
||||
llvm::SmallVector<TemplateArgument, 8> Args;
|
||||
Args.reserve(NumArgs);
|
||||
while (NumArgs--)
|
||||
Args.push_back(ReadTemplateArgument(Record, Idx));
|
||||
return Context->getDependentTemplateSpecializationType(Keyword, NNS, Name,
|
||||
Args.size(), Args.data());
|
||||
}
|
||||
|
||||
case pch::TYPE_TEMPLATE_SPECIALIZATION: {
|
||||
unsigned Idx = 0;
|
||||
|
|
|
@ -261,15 +261,20 @@ PCHTypeWriter::VisitDependentNameType(const DependentNameType *T) {
|
|||
void
|
||||
PCHTypeWriter::VisitDependentTemplateSpecializationType(
|
||||
const DependentTemplateSpecializationType *T) {
|
||||
// FIXME: Serialize this type (C++ only)
|
||||
assert(false && "Cannot serialize dependent template specialization types");
|
||||
Record.push_back(T->getKeyword());
|
||||
Writer.AddNestedNameSpecifier(T->getQualifier(), Record);
|
||||
Writer.AddIdentifierRef(T->getIdentifier(), Record);
|
||||
Record.push_back(T->getNumArgs());
|
||||
for (DependentTemplateSpecializationType::iterator
|
||||
I = T->begin(), E = T->end(); I != E; ++I)
|
||||
Writer.AddTemplateArgument(*I, Record);
|
||||
Code = pch::TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION;
|
||||
}
|
||||
|
||||
void PCHTypeWriter::VisitElaboratedType(const ElaboratedType *T) {
|
||||
Writer.AddTypeRef(T->getNamedType(), Record);
|
||||
Record.push_back(T->getKeyword());
|
||||
// FIXME: Serialize the qualifier (C++ only)
|
||||
assert(T->getQualifier() == 0 && "Cannot serialize qualified name types");
|
||||
Writer.AddNestedNameSpecifier(T->getQualifier(), Record);
|
||||
Writer.AddTypeRef(T->getNamedType(), Record);
|
||||
Code = pch::TYPE_ELABORATED;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue