In the AST reader, factor out the mapping of local type IDs to global

type IDs into a single place, and make sure that all of the callers
use the appropriate functions to do the mapping. Since the mapping is
still the identity function, this is essentially a no-op.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@135733 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Douglas Gregor 2011-07-22 00:38:23 +00:00
Родитель 19d9d2ebbe
Коммит 393f249399
4 изменённых файлов: 108 добавлений и 81 удалений

Просмотреть файл

@ -914,7 +914,7 @@ private:
uint64_t Offset;
};
QualType ReadTypeRecord(unsigned Index);
QualType readTypeRecord(unsigned Index);
RecordLocation TypeCursorForIndex(unsigned Index);
void LoadedDecl(unsigned Index, Decl *D);
Decl *ReadDeclRecord(unsigned Index, serialization::DeclID ID);
@ -1114,6 +1114,21 @@ public:
/// type.
QualType GetType(serialization::TypeID ID);
/// \brief Resolve a local type ID within a given AST file into a type.
QualType getLocalType(PerFileData &F, unsigned LocalID);
/// \brief Map a local type ID within a given AST file into a global type ID.
serialization::TypeID getGlobalTypeID(PerFileData &F, unsigned LocalID) const;
/// \brief Read a type from the current position in the given record, which
/// was read from the given AST file.
QualType readType(PerFileData &F, const RecordData &Record, unsigned &Idx) {
if (Idx >= Record.size())
return QualType();
return getLocalType(F, Record[Idx++]);
}
/// \brief Returns the type ID associated with the given type.
/// If the type didn't come from the AST file the ID that is returned is
/// marked as "doesn't exist in AST".
@ -1312,7 +1327,8 @@ public:
}
/// \brief Read a declaration name.
DeclarationName ReadDeclarationName(const RecordData &Record, unsigned &Idx);
DeclarationName ReadDeclarationName(PerFileData &F,
const RecordData &Record, unsigned &Idx);
void ReadDeclarationNameLoc(PerFileData &F,
DeclarationNameLoc &DNLoc, DeclarationName Name,
const RecordData &Record, unsigned &Idx);

Просмотреть файл

@ -738,7 +738,8 @@ typedef OnDiskChainedHashTable<ASTIdentifierLookupTrait>
namespace {
class ASTDeclContextNameLookupTrait {
ASTReader &Reader;
ASTReader::PerFileData &F;
public:
/// \brief Pair of begin/end iterators for DeclIDs.
typedef std::pair<DeclID *, DeclID *> data_type;
@ -755,7 +756,9 @@ public:
typedef DeclarationName external_key_type;
typedef DeclNameKey internal_key_type;
explicit ASTDeclContextNameLookupTrait(ASTReader &Reader) : Reader(Reader) { }
explicit ASTDeclContextNameLookupTrait(ASTReader &Reader,
ASTReader::PerFileData &F)
: Reader(Reader), F(F) { }
static bool EqualKey(const internal_key_type& a,
const internal_key_type& b) {
@ -834,15 +837,15 @@ public:
case DeclarationName::CXXConstructorName:
return Context->DeclarationNames.getCXXConstructorName(
Context->getCanonicalType(Reader.GetType(Key.Data)));
Context->getCanonicalType(Reader.getLocalType(F, Key.Data)));
case DeclarationName::CXXDestructorName:
return Context->DeclarationNames.getCXXDestructorName(
Context->getCanonicalType(Reader.GetType(Key.Data)));
Context->getCanonicalType(Reader.getLocalType(F, Key.Data)));
case DeclarationName::CXXConversionFunctionName:
return Context->DeclarationNames.getCXXConversionFunctionName(
Context->getCanonicalType(Reader.GetType(Key.Data)));
Context->getCanonicalType(Reader.getLocalType(F, Key.Data)));
case DeclarationName::CXXOperatorName:
return Context->DeclarationNames.getCXXOperatorName(
@ -957,7 +960,7 @@ bool ASTReader::ReadDeclContextStorage(llvm::BitstreamCursor &Cursor,
= ASTDeclContextNameLookupTable::Create(
(const unsigned char *)Blob + Record[0],
(const unsigned char *)Blob,
ASTDeclContextNameLookupTrait(*this));
ASTDeclContextNameLookupTrait(*this, *Info.F));
} else {
Info.NameLookupTableData = 0;
}
@ -2077,7 +2080,7 @@ ASTReader::ReadASTBlock(PerFileData &F) {
void *Table = ASTDeclContextNameLookupTable::Create(
(const unsigned char *)BlobStart + Record[1],
(const unsigned char *)BlobStart,
ASTDeclContextNameLookupTrait(*this));
ASTDeclContextNameLookupTrait(*this, F));
if (ID == 1 && Context) { // Is it the TU?
DeclContextInfo Info = {
&F, Table, /* No lexical inforamtion */ 0, 0
@ -2143,11 +2146,8 @@ ASTReader::ReadASTBlock(PerFileData &F) {
break;
case SPECIAL_TYPES:
// Optimization for the first block
if (SpecialTypes.empty())
SpecialTypes.swap(Record);
else
SpecialTypes.insert(SpecialTypes.end(), Record.begin(), Record.end());
for (unsigned I = 0, N = Record.size(); I != N; ++I)
SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
break;
case STATISTICS:
@ -3175,7 +3175,7 @@ ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
/// routine actually reads the record corresponding to the type at the given
/// location. It is a helper routine for GetType, which deals with reading type
/// IDs.
QualType ASTReader::ReadTypeRecord(unsigned Index) {
QualType ASTReader::readTypeRecord(unsigned Index) {
RecordLocation Loc = TypeCursorForIndex(Index);
llvm::BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
@ -3188,6 +3188,7 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
// Note that we are loading a type record.
Deserializing AType(this);
unsigned Idx = 0;
DeclsCursor.JumpToBit(Loc.Offset);
RecordData Record;
unsigned Code = DeclsCursor.ReadCode();
@ -3197,8 +3198,8 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
Error("Incorrect encoding of extended qualifier type");
return QualType();
}
QualType Base = GetType(Record[0]);
Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[1]);
QualType Base = readType(*Loc.F, Record, Idx);
Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]);
return Context->getQualifiedType(Base, Quals);
}
@ -3207,7 +3208,7 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
Error("Incorrect encoding of complex type");
return QualType();
}
QualType ElemType = GetType(Record[0]);
QualType ElemType = readType(*Loc.F, Record, Idx);
return Context->getComplexType(ElemType);
}
@ -3216,7 +3217,7 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
Error("Incorrect encoding of pointer type");
return QualType();
}
QualType PointeeType = GetType(Record[0]);
QualType PointeeType = readType(*Loc.F, Record, Idx);
return Context->getPointerType(PointeeType);
}
@ -3225,7 +3226,7 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
Error("Incorrect encoding of block pointer type");
return QualType();
}
QualType PointeeType = GetType(Record[0]);
QualType PointeeType = readType(*Loc.F, Record, Idx);
return Context->getBlockPointerType(PointeeType);
}
@ -3234,7 +3235,7 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
Error("Incorrect encoding of lvalue reference type");
return QualType();
}
QualType PointeeType = GetType(Record[0]);
QualType PointeeType = readType(*Loc.F, Record, Idx);
return Context->getLValueReferenceType(PointeeType, Record[1]);
}
@ -3243,7 +3244,7 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
Error("Incorrect encoding of rvalue reference type");
return QualType();
}
QualType PointeeType = GetType(Record[0]);
QualType PointeeType = readType(*Loc.F, Record, Idx);
return Context->getRValueReferenceType(PointeeType);
}
@ -3252,8 +3253,8 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
Error("Incorrect encoding of member pointer type");
return QualType();
}
QualType PointeeType = GetType(Record[0]);
QualType ClassType = GetType(Record[1]);
QualType PointeeType = readType(*Loc.F, Record, Idx);
QualType ClassType = readType(*Loc.F, Record, Idx);
if (PointeeType.isNull() || ClassType.isNull())
return QualType();
@ -3261,7 +3262,7 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
}
case TYPE_CONSTANT_ARRAY: {
QualType ElementType = GetType(Record[0]);
QualType ElementType = readType(*Loc.F, Record, Idx);
ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
unsigned IndexTypeQuals = Record[2];
unsigned Idx = 3;
@ -3271,14 +3272,14 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
}
case TYPE_INCOMPLETE_ARRAY: {
QualType ElementType = GetType(Record[0]);
QualType ElementType = readType(*Loc.F, Record, Idx);
ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
unsigned IndexTypeQuals = Record[2];
return Context->getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
}
case TYPE_VARIABLE_ARRAY: {
QualType ElementType = GetType(Record[0]);
QualType ElementType = readType(*Loc.F, Record, Idx);
ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
unsigned IndexTypeQuals = Record[2];
SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
@ -3294,7 +3295,7 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
return QualType();
}
QualType ElementType = GetType(Record[0]);
QualType ElementType = readType(*Loc.F, Record, Idx);
unsigned NumElements = Record[1];
unsigned VecKind = Record[2];
return Context->getVectorType(ElementType, NumElements,
@ -3307,7 +3308,7 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
return QualType();
}
QualType ElementType = GetType(Record[0]);
QualType ElementType = readType(*Loc.F, Record, Idx);
unsigned NumElements = Record[1];
return Context->getExtVectorType(ElementType, NumElements);
}
@ -3317,14 +3318,14 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
Error("incorrect encoding of no-proto function type");
return QualType();
}
QualType ResultType = GetType(Record[0]);
QualType ResultType = readType(*Loc.F, Record, Idx);
FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
(CallingConv)Record[4], Record[5]);
return Context->getFunctionNoProtoType(ResultType, Info);
}
case TYPE_FUNCTION_PROTO: {
QualType ResultType = GetType(Record[0]);
QualType ResultType = readType(*Loc.F, Record, Idx);
FunctionProtoType::ExtProtoInfo EPI;
EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
@ -3337,7 +3338,7 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
unsigned NumParams = Record[Idx++];
llvm::SmallVector<QualType, 16> ParamTypes;
for (unsigned I = 0; I != NumParams; ++I)
ParamTypes.push_back(GetType(Record[Idx++]));
ParamTypes.push_back(readType(*Loc.F, Record, Idx));
EPI.Variadic = Record[Idx++];
EPI.TypeQuals = Record[Idx++];
@ -3349,7 +3350,7 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
EPI.NumExceptions = Record[Idx++];
llvm::SmallVector<QualType, 2> Exceptions;
for (unsigned I = 0; I != EPI.NumExceptions; ++I)
Exceptions.push_back(GetType(Record[Idx++]));
Exceptions.push_back(readType(*Loc.F, Record, Idx));
EPI.Exceptions = Exceptions.data();
} else if (EST == EST_ComputedNoexcept) {
EPI.NoexceptExpr = ReadExpr(*Loc.F);
@ -3371,7 +3372,7 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
}
unsigned Idx = 0;
TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx);
QualType Canonical = GetType(Record[1]);
QualType Canonical = readType(*Loc.F, Record, Idx);
if (!Canonical.isNull())
Canonical = Context->getCanonicalType(Canonical);
return Context->getTypedefType(Decl, Canonical);
@ -3385,7 +3386,7 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
Error("incorrect encoding of typeof(type) in AST file");
return QualType();
}
QualType UnderlyingType = GetType(Record[0]);
QualType UnderlyingType = readType(*Loc.F, Record, Idx);
return Context->getTypeOfType(UnderlyingType);
}
@ -3393,14 +3394,14 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
return Context->getDecltypeType(ReadExpr(*Loc.F));
case TYPE_UNARY_TRANSFORM: {
QualType BaseType = GetType(Record[0]);
QualType UnderlyingType = GetType(Record[1]);
QualType BaseType = readType(*Loc.F, Record, Idx);
QualType UnderlyingType = readType(*Loc.F, Record, Idx);
UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2];
return Context->getUnaryTransformType(BaseType, UnderlyingType, UKind);
}
case TYPE_AUTO:
return Context->getAutoType(GetType(Record[0]));
return Context->getAutoType(readType(*Loc.F, Record, Idx));
case TYPE_RECORD: {
if (Record.size() != 2) {
@ -3433,8 +3434,8 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
Error("incorrect encoding of attributed type");
return QualType();
}
QualType modifiedType = GetType(Record[0]);
QualType equivalentType = GetType(Record[1]);
QualType modifiedType = readType(*Loc.F, Record, Idx);
QualType equivalentType = readType(*Loc.F, Record, Idx);
AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
return Context->getAttributedType(kind, modifiedType, equivalentType);
}
@ -3444,7 +3445,7 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
Error("incorrect encoding of paren type");
return QualType();
}
QualType InnerType = GetType(Record[0]);
QualType InnerType = readType(*Loc.F, Record, Idx);
return Context->getParenType(InnerType);
}
@ -3453,7 +3454,7 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
Error("incorrect encoding of pack expansion type");
return QualType();
}
QualType Pattern = GetType(Record[0]);
QualType Pattern = readType(*Loc.F, Record, Idx);
if (Pattern.isNull())
return QualType();
llvm::Optional<unsigned> NumExpansions;
@ -3466,7 +3467,7 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
unsigned Idx = 0;
ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
QualType NamedType = GetType(Record[Idx++]);
QualType NamedType = readType(*Loc.F, Record, Idx);
return Context->getElaboratedType(Keyword, NNS, NamedType);
}
@ -3479,7 +3480,7 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
case TYPE_OBJC_OBJECT: {
unsigned Idx = 0;
QualType Base = GetType(Record[Idx++]);
QualType Base = readType(*Loc.F, Record, Idx);
unsigned NumProtos = Record[Idx++];
llvm::SmallVector<ObjCProtocolDecl*, 4> Protos;
for (unsigned I = 0; I != NumProtos; ++I)
@ -3489,14 +3490,14 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
case TYPE_OBJC_OBJECT_POINTER: {
unsigned Idx = 0;
QualType Pointee = GetType(Record[Idx++]);
QualType Pointee = readType(*Loc.F, Record, Idx);
return Context->getObjCObjectPointerType(Pointee);
}
case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
unsigned Idx = 0;
QualType Parm = GetType(Record[Idx++]);
QualType Replacement = GetType(Record[Idx++]);
QualType Parm = readType(*Loc.F, Record, Idx);
QualType Replacement = readType(*Loc.F, Record, Idx);
return
Context->getSubstTemplateTypeParmType(cast<TemplateTypeParmType>(Parm),
Replacement);
@ -3504,7 +3505,7 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
unsigned Idx = 0;
QualType Parm = GetType(Record[Idx++]);
QualType Parm = readType(*Loc.F, Record, Idx);
TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
return Context->getSubstTemplateTypeParmPackType(
cast<TemplateTypeParmType>(Parm),
@ -3512,9 +3513,8 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
}
case TYPE_INJECTED_CLASS_NAME: {
unsigned Idx = 0;
CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx);
QualType TST = GetType(Record[1]); // probably derivable
QualType TST = readType(*Loc.F, Record, Idx); // probably derivable
// FIXME: ASTContext::getInjectedClassNameType is not currently suitable
// for AST reading, too much interdependencies.
return
@ -3536,7 +3536,7 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
const IdentifierInfo *Name = this->GetIdentifierInfo(Record, Idx);
QualType Canon = GetType(Record[Idx++]);
QualType Canon = readType(*Loc.F, Record, Idx);
if (!Canon.isNull())
Canon = Context->getCanonicalType(Canon);
return Context->getDependentNameType(Keyword, NNS, Name, Canon);
@ -3560,7 +3560,7 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
unsigned Idx = 0;
// ArrayType
QualType ElementType = GetType(Record[Idx++]);
QualType ElementType = readType(*Loc.F, Record, Idx);
ArrayType::ArraySizeModifier ASM
= (ArrayType::ArraySizeModifier)Record[Idx++];
unsigned IndexTypeQuals = Record[Idx++];
@ -3579,7 +3579,7 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) {
TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
llvm::SmallVector<TemplateArgument, 8> Args;
ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
QualType Underlying = GetType(Record[Idx++]);
QualType Underlying = readType(*Loc.F, Record, Idx);
QualType T;
if (Underlying.isNull())
T = Context->getCanonicalTemplateSpecializationType(Name, Args.data(),
@ -3828,7 +3828,7 @@ void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
TypeSourceInfo *ASTReader::GetTypeSourceInfo(PerFileData &F,
const RecordData &Record,
unsigned &Idx) {
QualType InfoTy = GetType(Record[Idx++]);
QualType InfoTy = readType(F, Record, Idx);
if (InfoTy.isNull())
return 0;
@ -3891,7 +3891,7 @@ QualType ASTReader::GetType(TypeID ID) {
Index -= NUM_PREDEF_TYPE_IDS;
assert(Index < TypesLoaded.size() && "Type index out-of-range");
if (TypesLoaded[Index].isNull()) {
TypesLoaded[Index] = ReadTypeRecord(Index);
TypesLoaded[Index] = readTypeRecord(Index);
if (TypesLoaded[Index].isNull())
return QualType();
@ -3905,6 +3905,16 @@ QualType ASTReader::GetType(TypeID ID) {
return TypesLoaded[Index].withFastQualifiers(FastQuals);
}
QualType ASTReader::getLocalType(PerFileData &F, unsigned LocalID) {
return GetType(getGlobalTypeID(F, LocalID));
}
serialization::TypeID
ASTReader::getGlobalTypeID(PerFileData &F, unsigned LocalID) const {
// FIXME: Map from local type ID to global type ID.
return LocalID;
}
TypeID ASTReader::GetTypeID(QualType T) const {
return MakeTypeID(T,
std::bind1st(std::mem_fun(&ASTReader::GetTypeIdx), this));
@ -4751,7 +4761,8 @@ uint32_t ASTReader::GetNumExternalSelectors() {
}
DeclarationName
ASTReader::ReadDeclarationName(const RecordData &Record, unsigned &Idx) {
ASTReader::ReadDeclarationName(PerFileData &F,
const RecordData &Record, unsigned &Idx) {
DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
switch (Kind) {
case DeclarationName::Identifier:
@ -4764,15 +4775,15 @@ ASTReader::ReadDeclarationName(const RecordData &Record, unsigned &Idx) {
case DeclarationName::CXXConstructorName:
return Context->DeclarationNames.getCXXConstructorName(
Context->getCanonicalType(GetType(Record[Idx++])));
Context->getCanonicalType(readType(F, Record, Idx)));
case DeclarationName::CXXDestructorName:
return Context->DeclarationNames.getCXXDestructorName(
Context->getCanonicalType(GetType(Record[Idx++])));
Context->getCanonicalType(readType(F, Record, Idx)));
case DeclarationName::CXXConversionFunctionName:
return Context->DeclarationNames.getCXXConversionFunctionName(
Context->getCanonicalType(GetType(Record[Idx++])));
Context->getCanonicalType(readType(F, Record, Idx)));
case DeclarationName::CXXOperatorName:
return Context->DeclarationNames.getCXXOperatorName(
@ -4825,7 +4836,7 @@ void ASTReader::ReadDeclarationNameLoc(PerFileData &F,
void ASTReader::ReadDeclarationNameInfo(PerFileData &F,
DeclarationNameInfo &NameInfo,
const RecordData &Record, unsigned &Idx) {
NameInfo.setName(ReadDeclarationName(Record, Idx));
NameInfo.setName(ReadDeclarationName(F, Record, Idx));
NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
DeclarationNameLoc DNLoc;
ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
@ -4911,12 +4922,12 @@ ASTReader::ReadTemplateArgument(PerFileData &F,
case TemplateArgument::Null:
return TemplateArgument();
case TemplateArgument::Type:
return TemplateArgument(GetType(Record[Idx++]));
return TemplateArgument(readType(F, Record, Idx));
case TemplateArgument::Declaration:
return TemplateArgument(ReadDecl(F, Record, Idx));
case TemplateArgument::Integral: {
llvm::APSInt Value = ReadAPSInt(Record, Idx);
QualType T = GetType(Record[Idx++]);
QualType T = readType(F, Record, Idx);
return TemplateArgument(Value, T);
}
case TemplateArgument::Template:
@ -5113,7 +5124,7 @@ ASTReader::ReadNestedNameSpecifier(PerFileData &F,
case NestedNameSpecifier::TypeSpec:
case NestedNameSpecifier::TypeSpecWithTemplate: {
const Type *T = GetType(Record[Idx++]).getTypePtrOrNull();
const Type *T = readType(F, Record, Idx).getTypePtrOrNull();
if (!T)
return 0;

Просмотреть файл

@ -258,14 +258,14 @@ void ASTDeclReader::VisitTranslationUnitDecl(TranslationUnitDecl *TU) {
void ASTDeclReader::VisitNamedDecl(NamedDecl *ND) {
VisitDecl(ND);
ND->setDeclName(Reader.ReadDeclarationName(Record, Idx));
ND->setDeclName(Reader.ReadDeclarationName(F, Record, Idx));
}
void ASTDeclReader::VisitTypeDecl(TypeDecl *TD) {
VisitNamedDecl(TD);
TD->setLocStart(ReadSourceLocation(Record, Idx));
// Delay type reading until after we have fully initialized the decl.
TypeIDForTypeDecl = Record[Idx++];
TypeIDForTypeDecl = Reader.getGlobalTypeID(F, Record[Idx++]);
}
void ASTDeclReader::VisitTypedefDecl(TypedefDecl *TD) {
@ -299,8 +299,8 @@ void ASTDeclReader::VisitEnumDecl(EnumDecl *ED) {
if (TypeSourceInfo *TI = Reader.GetTypeSourceInfo(F, Record, Idx))
ED->setIntegerTypeSourceInfo(TI);
else
ED->setIntegerType(Reader.GetType(Record[Idx++]));
ED->setPromotionType(Reader.GetType(Record[Idx++]));
ED->setIntegerType(Reader.readType(F, Record, Idx));
ED->setPromotionType(Reader.readType(F, Record, Idx));
ED->setNumPositiveBits(Record[Idx++]);
ED->setNumNegativeBits(Record[Idx++]);
ED->IsScoped = Record[Idx++];
@ -318,7 +318,7 @@ void ASTDeclReader::VisitRecordDecl(RecordDecl *RD) {
void ASTDeclReader::VisitValueDecl(ValueDecl *VD) {
VisitNamedDecl(VD);
VD->setType(Reader.GetType(Record[Idx++]));
VD->setType(Reader.readType(F, Record, Idx));
}
void ASTDeclReader::VisitEnumConstantDecl(EnumConstantDecl *ECD) {
@ -485,7 +485,7 @@ void ASTDeclReader::VisitObjCMethodDecl(ObjCMethodDecl *MD) {
MD->setObjCDeclQualifier((Decl::ObjCDeclQualifier)Record[Idx++]);
MD->SetRelatedResultType(Record[Idx++]);
MD->setNumSelectorArgs(unsigned(Record[Idx++]));
MD->setResultType(Reader.GetType(Record[Idx++]));
MD->setResultType(Reader.readType(F, Record, Idx));
MD->setResultTypeSourceInfo(GetTypeSourceInfo(Record, Idx));
MD->setEndLoc(ReadSourceLocation(Record, Idx));
unsigned NumParams = Record[Idx++];
@ -506,7 +506,7 @@ void ASTDeclReader::VisitObjCContainerDecl(ObjCContainerDecl *CD) {
void ASTDeclReader::VisitObjCInterfaceDecl(ObjCInterfaceDecl *ID) {
VisitObjCContainerDecl(ID);
ID->setTypeForDecl(Reader.GetType(Record[Idx++]).getTypePtrOrNull());
ID->setTypeForDecl(Reader.readType(F, Record, Idx).getTypePtrOrNull());
ID->setSuperClass(ReadDeclAs<ObjCInterfaceDecl>(Record, Idx));
// Read the directly referenced protocols and their SourceLocations.
@ -645,8 +645,8 @@ void ASTDeclReader::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
// FIXME: stable encoding
D->setPropertyImplementation(
(ObjCPropertyDecl::PropertyControl)Record[Idx++]);
D->setGetterName(Reader.ReadDeclarationName(Record, Idx).getObjCSelector());
D->setSetterName(Reader.ReadDeclarationName(Record, Idx).getObjCSelector());
D->setGetterName(Reader.ReadDeclarationName(F,Record, Idx).getObjCSelector());
D->setSetterName(Reader.ReadDeclarationName(F,Record, Idx).getObjCSelector());
D->setGetterMethodDecl(ReadDeclAs<ObjCMethodDecl>(Record, Idx));
D->setSetterMethodDecl(ReadDeclAs<ObjCMethodDecl>(Record, Idx));
D->setPropertyIvarDecl(ReadDeclAs<ObjCIvarDecl>(Record, Idx));
@ -1257,7 +1257,7 @@ void ASTDeclReader::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
if (D->isExpandedParameterPack()) {
void **Data = reinterpret_cast<void **>(D + 1);
for (unsigned I = 0, N = D->getNumExpansionTypes(); I != N; ++I) {
Data[2*I] = Reader.GetType(Record[Idx++]).getAsOpaquePtr();
Data[2*I] = Reader.readType(F, Record, Idx).getAsOpaquePtr();
Data[2*I + 1] = GetTypeSourceInfo(Record, Idx);
}
} else {

Просмотреть файл

@ -305,7 +305,7 @@ void ASTStmtReader::VisitAsmStmt(AsmStmt *S) {
void ASTStmtReader::VisitExpr(Expr *E) {
VisitStmt(E);
E->setType(Reader.GetType(Record[Idx++]));
E->setType(Reader.readType(F, Record, Idx));
E->setTypeDependent(Record[Idx++]);
E->setValueDependent(Record[Idx++]);
E->setInstantiationDependent(Record[Idx++]);
@ -540,8 +540,8 @@ void ASTStmtReader::VisitBinaryOperator(BinaryOperator *E) {
void ASTStmtReader::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
VisitBinaryOperator(E);
E->setComputationLHSType(Reader.GetType(Record[Idx++]));
E->setComputationResultType(Reader.GetType(Record[Idx++]));
E->setComputationLHSType(Reader.readType(F, Record, Idx));
E->setComputationResultType(Reader.readType(F, Record, Idx));
}
void ASTStmtReader::VisitConditionalOperator(ConditionalOperator *E) {
@ -826,7 +826,7 @@ void ASTStmtReader::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
E->setBase(Reader.ReadSubExpr());
break;
case 1:
E->setSuperReceiver(Reader.GetType(Record[Idx++]));
E->setSuperReceiver(Reader.readType(F, Record, Idx));
break;
case 2:
E->setClassReceiver(ReadDeclAs<ObjCInterfaceDecl>(Record, Idx));
@ -852,7 +852,7 @@ void ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) {
case ObjCMessageExpr::SuperClass:
case ObjCMessageExpr::SuperInstance: {
QualType T = Reader.GetType(Record[Idx++]);
QualType T = Reader.readType(F, Record, Idx);
SourceLocation SuperLoc = ReadSourceLocation(Record, Idx);
E->setSuper(SuperLoc, T, Kind == ObjCMessageExpr::SuperInstance);
break;
@ -1155,7 +1155,7 @@ ASTStmtReader::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){
Record[Idx++]);
E->Base = Reader.ReadSubExpr();
E->BaseType = Reader.GetType(Record[Idx++]);
E->BaseType = Reader.readType(F, Record, Idx);
E->IsArrow = Record[Idx++];
E->OperatorLoc = ReadSourceLocation(Record, Idx);
E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
@ -1213,7 +1213,7 @@ void ASTStmtReader::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
E->IsArrow = Record[Idx++];
E->HasUnresolvedUsing = Record[Idx++];
E->Base = Reader.ReadSubExpr();
E->BaseType = Reader.GetType(Record[Idx++]);
E->BaseType = Reader.readType(F, Record, Idx);
E->OperatorLoc = ReadSourceLocation(Record, Idx);
}
@ -1620,7 +1620,7 @@ Stmt *ASTReader::ReadStmtFromStream(PerFileData &F) {
AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
DeclAccessPair FoundDecl = DeclAccessPair::make(FoundD, AS);
QualType T = GetType(Record[Idx++]);
QualType T = readType(F, Record, Idx);
ExprValueKind VK = static_cast<ExprValueKind>(Record[Idx++]);
ExprObjectKind OK = static_cast<ExprObjectKind>(Record[Idx++]);
Expr *Base = ReadSubExpr();