diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h index 24fc070ec120..60f212929559 100644 --- a/clang/include/clang/Serialization/ASTReader.h +++ b/clang/include/clang/Serialization/ASTReader.h @@ -224,6 +224,7 @@ private: /// First (not depending on another) PCH in chain is in front. std::vector ASTBuffers; +public: /// \brief Information that is needed for every module. struct PerFileData { PerFileData(ASTFileType Ty); @@ -436,7 +437,8 @@ private: /// directly loaded modules. SmallVector Loaders; }; - +private: + /// \brief All loaded modules, indexed by name. llvm::StringMap Modules; @@ -1121,11 +1123,51 @@ public: /// marked as "doesn't exist in AST". serialization::TypeIdx GetTypeIdx(QualType T) const; + /// \brief Map from a local declaration ID within a given module to a + /// global declaration ID. + serialization::DeclID getGlobalDeclID(PerFileData &F, unsigned LocalID) const; + /// \brief Resolve a declaration ID into a declaration, potentially /// building a new declaration. Decl *GetDecl(serialization::DeclID ID); virtual Decl *GetExternalDecl(uint32_t ID); + /// \brief Reads a declaration with the given local ID in the give module. + Decl *GetLocalDecl(PerFileData &F, uint32_t LocalID) { + return GetDecl(getGlobalDeclID(F, LocalID)); + } + + /// \brief Reads a declaration with the given local ID in the give module. + /// + /// \returns The requested declaration, casted to the given return type. + template + T *GetLocalDeclAs(PerFileData &F, uint32_t LocalID) { + return cast_or_null(GetLocalDecl(F, LocalID)); + } + + /// \brief Reads a declaration ID from the given position in a record in the + /// given module. + /// + /// \returns The declaration ID read from the record, adjusted to a global ID. + serialization::DeclID ReadDeclID(PerFileData &F, const RecordData &Record, + unsigned &Idx); + + /// \brief Reads a declaration from the given position in a record in the + /// given module. + Decl *ReadDecl(PerFileData &F, const RecordData &R, unsigned &I) { + return GetDecl(ReadDeclID(F, R, I)); + } + + /// \brief Reads a declaration from the given position in a record in the + /// given module. + /// + /// \returns The declaration read from this location, casted to the given + /// result type. + template + T *ReadDeclAs(PerFileData &F, const RecordData &R, unsigned &I) { + return cast_or_null(GetDecl(ReadDeclID(F, R, I))); + } + /// \brief Resolve a CXXBaseSpecifiers ID into an offset into the chain /// of loaded AST files. uint64_t GetCXXBaseSpecifiersOffset(serialization::CXXBaseSpecifiersID ID); @@ -1279,7 +1321,8 @@ public: void ReadQualifierInfo(PerFileData &F, QualifierInfo &Info, const RecordData &Record, unsigned &Idx); - NestedNameSpecifier *ReadNestedNameSpecifier(const RecordData &Record, + NestedNameSpecifier *ReadNestedNameSpecifier(PerFileData &F, + const RecordData &Record, unsigned &Idx); NestedNameSpecifierLoc ReadNestedNameSpecifierLoc(PerFileData &F, @@ -1306,7 +1349,7 @@ public: unsigned &Idx); /// \brief Read a UnresolvedSet structure. - void ReadUnresolvedSet(UnresolvedSetImpl &Set, + void ReadUnresolvedSet(PerFileData &F, UnresolvedSetImpl &Set, const RecordData &Record, unsigned &Idx); /// \brief Read a C++ base specifier. @@ -1356,7 +1399,8 @@ public: /// \brief Read a version tuple. VersionTuple ReadVersionTuple(const RecordData &Record, unsigned &Idx); - CXXTemporary *ReadCXXTemporary(const RecordData &Record, unsigned &Idx); + CXXTemporary *ReadCXXTemporary(PerFileData &F, const RecordData &Record, + unsigned &Idx); /// \brief Reads attributes from the current stream position. void ReadAttributes(PerFileData &F, AttrVec &Attrs, diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index c8f5db214c0a..74fbd6cc5e27 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -483,7 +483,8 @@ ASTReader::setDeserializationListener(ASTDeserializationListener *Listener) { namespace { class ASTSelectorLookupTrait { ASTReader &Reader; - + ASTReader::PerFileData &F; + public: struct data_type { SelectorID ID; @@ -493,7 +494,8 @@ public: typedef Selector external_key_type; typedef external_key_type internal_key_type; - explicit ASTSelectorLookupTrait(ASTReader &Reader) : Reader(Reader) { } + ASTSelectorLookupTrait(ASTReader &Reader, ASTReader::PerFileData &F) + : Reader(Reader), F(F) { } static bool EqualKey(const internal_key_type& a, const internal_key_type& b) { @@ -548,7 +550,7 @@ public: ObjCMethodList *Prev = 0; for (unsigned I = 0; I != NumInstanceMethods; ++I) { ObjCMethodDecl *Method - = cast(Reader.GetDecl(ReadUnalignedLE32(d))); + = Reader.GetLocalDeclAs(F, ReadUnalignedLE32(d)); if (!Result.Instance.Method) { // This is the first method, which is the easy case. Result.Instance.Method = Method; @@ -566,7 +568,7 @@ public: Prev = 0; for (unsigned I = 0; I != NumFactoryMethods; ++I) { ObjCMethodDecl *Method - = cast(Reader.GetDecl(ReadUnalignedLE32(d))); + = Reader.GetLocalDeclAs(F, ReadUnalignedLE32(d)); if (!Result.Factory.Method) { // This is the first method, which is the easy case. Result.Factory.Method = Method; @@ -2135,12 +2137,8 @@ ASTReader::ReadASTBlock(PerFileData &F) { break; case EXTERNAL_DEFINITIONS: - // Optimization for the first block. - if (ExternalDefinitions.empty()) - ExternalDefinitions.swap(Record); - else - ExternalDefinitions.insert(ExternalDefinitions.end(), - Record.begin(), Record.end()); + for (unsigned I = 0, N = Record.size(); I != N; ++I) + ExternalDefinitions.push_back(getGlobalDeclID(F, Record[I])); break; case SPECIAL_TYPES: @@ -2159,21 +2157,13 @@ ASTReader::ReadASTBlock(PerFileData &F) { break; case UNUSED_FILESCOPED_DECLS: - // Optimization for the first block. - if (UnusedFileScopedDecls.empty()) - UnusedFileScopedDecls.swap(Record); - else - UnusedFileScopedDecls.insert(UnusedFileScopedDecls.end(), - Record.begin(), Record.end()); + for (unsigned I = 0, N = Record.size(); I != N; ++I) + UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I])); break; case DELEGATING_CTORS: - // Optimization for the first block. - if (DelegatingCtorDecls.empty()) - DelegatingCtorDecls.swap(Record); - else - DelegatingCtorDecls.insert(DelegatingCtorDecls.end(), - Record.begin(), Record.end()); + for (unsigned I = 0, N = Record.size(); I != N; ++I) + DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I])); break; case WEAK_UNDECLARED_IDENTIFIERS: @@ -2182,12 +2172,8 @@ ASTReader::ReadASTBlock(PerFileData &F) { break; case LOCALLY_SCOPED_EXTERNAL_DECLS: - // Optimization for the first block. - if (LocallyScopedExternalDecls.empty()) - LocallyScopedExternalDecls.swap(Record); - else - LocallyScopedExternalDecls.insert(LocallyScopedExternalDecls.end(), - Record.begin(), Record.end()); + for (unsigned I = 0, N = Record.size(); I != N; ++I) + LocallyScopedExternalDecls.push_back(getGlobalDeclID(F, Record[I])); break; case SELECTOR_OFFSETS: @@ -2210,7 +2196,7 @@ ASTReader::ReadASTBlock(PerFileData &F) { = ASTSelectorLookupTable::Create( F.SelectorLookupTableData + Record[0], F.SelectorLookupTableData, - ASTSelectorLookupTrait(*this)); + ASTSelectorLookupTrait(*this, F)); TotalNumMethodPoolEntries += Record[1]; break; @@ -2301,35 +2287,34 @@ ASTReader::ReadASTBlock(PerFileData &F) { } case EXT_VECTOR_DECLS: - // Optimization for the first block. - if (ExtVectorDecls.empty()) - ExtVectorDecls.swap(Record); - else - ExtVectorDecls.insert(ExtVectorDecls.end(), - Record.begin(), Record.end()); + for (unsigned I = 0, N = Record.size(); I != N; ++I) + ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I])); break; case VTABLE_USES: // Later tables overwrite earlier ones. - VTableUses.swap(Record); + // FIXME: Modules will have some trouble with this. + VTableUses.clear(); + for (unsigned I = 0, N = Record.size(); I != N; ++I) + VTableUses.push_back(getGlobalDeclID(F, Record[I])); break; case DYNAMIC_CLASSES: - // Optimization for the first block. - if (DynamicClasses.empty()) - DynamicClasses.swap(Record); - else - DynamicClasses.insert(DynamicClasses.end(), - Record.begin(), Record.end()); + for (unsigned I = 0, N = Record.size(); I != N; ++I) + DynamicClasses.push_back(getGlobalDeclID(F, Record[I])); break; case PENDING_IMPLICIT_INSTANTIATIONS: - F.PendingInstantiations.swap(Record); + for (unsigned I = 0, N = Record.size(); I != N; ++I) + F.PendingInstantiations.push_back(getGlobalDeclID(F, Record[I])); break; case SEMA_DECL_REFS: // Later tables overwrite earlier ones. - SemaDeclRefs.swap(Record); + // FIXME: Modules will have some trouble with this. + SemaDeclRefs.clear(); + for (unsigned I = 0, N = Record.size(); I != N; ++I) + SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I])); break; case ORIGINAL_FILE_NAME: @@ -2456,7 +2441,10 @@ ASTReader::ReadASTBlock(PerFileData &F) { case CUDA_SPECIAL_DECL_REFS: // Later tables overwrite earlier ones. - CUDASpecialDeclRefs.swap(Record); + // FIXME: Modules will have trouble with this. + CUDASpecialDeclRefs.clear(); + for (unsigned I = 0, N = Record.size(); I != N; ++I) + CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I])); break; case HEADER_SEARCH_TABLE: @@ -2483,21 +2471,13 @@ ASTReader::ReadASTBlock(PerFileData &F) { break; case TENTATIVE_DEFINITIONS: - // Optimization for the first block. - if (TentativeDefinitions.empty()) - TentativeDefinitions.swap(Record); - else - TentativeDefinitions.insert(TentativeDefinitions.end(), - Record.begin(), Record.end()); + for (unsigned I = 0, N = Record.size(); I != N; ++I) + TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I])); break; case KNOWN_NAMESPACES: - // Optimization for the first block. - if (KnownNamespaces.empty()) - KnownNamespaces.swap(Record); - else - KnownNamespaces.insert(KnownNamespaces.end(), - Record.begin(), Record.end()); + for (unsigned I = 0, N = Record.size(); I != N; ++I) + KnownNamespaces.push_back(getGlobalDeclID(F, Record[I])); break; } First = false; @@ -3377,16 +3357,19 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) { EPI); } - case TYPE_UNRESOLVED_USING: + case TYPE_UNRESOLVED_USING: { + unsigned Idx = 0; return Context->getTypeDeclType( - cast(GetDecl(Record[0]))); - + ReadDeclAs(*Loc.F, Record, Idx)); + } + case TYPE_TYPEDEF: { if (Record.size() != 2) { Error("incorrect encoding of typedef type"); return QualType(); } - TypedefNameDecl *Decl = cast(GetDecl(Record[0])); + unsigned Idx = 0; + TypedefNameDecl *Decl = ReadDeclAs(*Loc.F, Record, Idx); QualType Canonical = GetType(Record[1]); if (!Canonical.isNull()) Canonical = Context->getCanonicalType(Canonical); @@ -3423,8 +3406,10 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) { Error("incorrect encoding of record type"); return QualType(); } - bool IsDependent = Record[0]; - QualType T = Context->getRecordType(cast(GetDecl(Record[1]))); + unsigned Idx = 0; + bool IsDependent = Record[Idx++]; + QualType T + = Context->getRecordType(ReadDeclAs(*Loc.F, Record, Idx)); const_cast(T.getTypePtr())->setDependent(IsDependent); return T; } @@ -3434,8 +3419,10 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) { Error("incorrect encoding of enum type"); return QualType(); } - bool IsDependent = Record[0]; - QualType T = Context->getEnumType(cast(GetDecl(Record[1]))); + unsigned Idx = 0; + bool IsDependent = Record[Idx++]; + QualType T + = Context->getEnumType(ReadDeclAs(*Loc.F, Record, Idx)); const_cast(T.getTypePtr())->setDependent(IsDependent); return T; } @@ -3477,14 +3464,15 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) { case TYPE_ELABORATED: { unsigned Idx = 0; ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; - NestedNameSpecifier *NNS = ReadNestedNameSpecifier(Record, Idx); + NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); QualType NamedType = GetType(Record[Idx++]); return Context->getElaboratedType(Keyword, NNS, NamedType); } case TYPE_OBJC_INTERFACE: { unsigned Idx = 0; - ObjCInterfaceDecl *ItfD = cast(GetDecl(Record[Idx++])); + ObjCInterfaceDecl *ItfD + = ReadDeclAs(*Loc.F, Record, Idx); return Context->getObjCInterfaceType(ItfD); } @@ -3494,7 +3482,7 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) { unsigned NumProtos = Record[Idx++]; llvm::SmallVector Protos; for (unsigned I = 0; I != NumProtos; ++I) - Protos.push_back(cast(GetDecl(Record[Idx++]))); + Protos.push_back(ReadDeclAs(*Loc.F, Record, Idx)); return Context->getObjCObjectType(Base, Protos.data(), NumProtos); } @@ -3523,7 +3511,8 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) { } case TYPE_INJECTED_CLASS_NAME: { - CXXRecordDecl *D = cast(GetDecl(Record[0])); + unsigned Idx = 0; + CXXRecordDecl *D = ReadDeclAs(*Loc.F, Record, Idx); QualType TST = GetType(Record[1]); // probably derivable // FIXME: ASTContext::getInjectedClassNameType is not currently suitable // for AST reading, too much interdependencies. @@ -3536,15 +3525,15 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) { unsigned Depth = Record[Idx++]; unsigned Index = Record[Idx++]; bool Pack = Record[Idx++]; - TemplateTypeParmDecl *D = - cast_or_null(GetDecl(Record[Idx++])); + TemplateTypeParmDecl *D + = ReadDeclAs(*Loc.F, Record, Idx); return Context->getTemplateTypeParmType(Depth, Index, Pack, D); } case TYPE_DEPENDENT_NAME: { unsigned Idx = 0; ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; - NestedNameSpecifier *NNS = ReadNestedNameSpecifier(Record, Idx); + NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); const IdentifierInfo *Name = this->GetIdentifierInfo(Record, Idx); QualType Canon = GetType(Record[Idx++]); if (!Canon.isNull()) @@ -3555,7 +3544,7 @@ QualType ASTReader::ReadTypeRecord(unsigned Index) { case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: { unsigned Idx = 0; ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; - NestedNameSpecifier *NNS = ReadNestedNameSpecifier(Record, Idx); + NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); const IdentifierInfo *Name = this->GetIdentifierInfo(Record, Idx); unsigned NumArgs = Record[Idx++]; llvm::SmallVector Args; @@ -3617,6 +3606,11 @@ class clang::TypeLocReader : public TypeLocVisitor { return Reader.ReadSourceLocation(F, R, I); } + template + T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) { + return Reader.ReadDeclAs(F, Record, Idx); + } + public: TypeLocReader(ASTReader &Reader, ASTReader::PerFileData &F, const ASTReader::RecordData &Record, unsigned &Idx) @@ -3702,7 +3696,7 @@ void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) { TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx)); TL.setTrailingReturn(Record[Idx++]); for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) { - TL.setArg(i, cast_or_null(Reader.GetDecl(Record[Idx++]))); + TL.setArg(i, ReadDeclAs(Record, Idx)); } } void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) { @@ -4048,6 +4042,12 @@ TranslationUnitDecl *ASTReader::GetTranslationUnitDecl() { return cast(DeclsLoaded[0]); } +serialization::DeclID +ASTReader::getGlobalDeclID(PerFileData &F, unsigned LocalID) const { + // FIXME: Perform local -> global remapping for declarations. + return LocalID; +} + Decl *ASTReader::GetDecl(DeclID ID) { if (ID == 0) return 0; @@ -4067,6 +4067,17 @@ Decl *ASTReader::GetDecl(DeclID ID) { return DeclsLoaded[Index]; } +serialization::DeclID ASTReader::ReadDeclID(PerFileData &F, + const RecordData &Record, + unsigned &Idx) { + if (Idx >= Record.size()) { + Error("Corrupted AST file"); + return 0; + } + + return getGlobalDeclID(F, Record[Idx++]); +} + /// \brief Resolve the offset of a statement into a statement. /// /// This operation will read a new statement from the external @@ -4109,7 +4120,9 @@ ExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC, *IDE = ID + I->NumLexicalDecls; ID != IDE; ++ID) { if (isKindWeWant && !isKindWeWant((Decl::Kind)ID->first)) continue; - + + // FIXME: Modules need to know whether this is already mapped to a + // global ID or not. Decl *D = GetDecl(ID->second); assert(D && "Null decl in lexical decls"); Decls.push_back(D); @@ -4145,6 +4158,8 @@ ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, if (Pos == LookupTable->end()) continue; + // FIXME: Modules need to know whether this is already mapped to a + // global ID or not. ASTDeclContextNameLookupTrait::data_type Data = *Pos; for (; Data.first != Data.second; ++Data.first) Decls.push_back(cast(GetDecl(*Data.first))); @@ -4179,6 +4194,8 @@ void ASTReader::MaterializeVisibleDecls(const DeclContext *DC) { = *ItemI; ASTDeclContextNameLookupTrait::data_type Data = Val.second; Decls.clear(); + // FIXME: Modules need to know whether this is already mapped to a + // global ID or not. for (; Data.first != Data.second; ++Data.first) Decls.push_back(cast(GetDecl(*Data.first))); MaterializeVisibleDeclsForName(DC, Val.first, Decls); @@ -4647,6 +4664,7 @@ ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II, } for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) { + // FIXME: Are these IDs local or global? It's not clear! NamedDecl *D = cast(GetDecl(DeclIDs[I])); if (SemaObj) { if (SemaObj->TUScope) { @@ -4717,8 +4735,8 @@ Selector ASTReader::DecodeSelector(unsigned ID) { // Load this selector from the selector table. GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID); assert(I != GlobalSelectorMap.end() && "Corrupted global selector map"); - ASTSelectorLookupTrait Trait(*this); PerFileData &F = *I->second.first; + ASTSelectorLookupTrait Trait(*this, F); unsigned Idx = ID - 1 + I->second.second; SelectorsLoaded[ID - 1] = Trait.ReadKey(F.SelectorLookupTableData + F.SelectorOffsets[Idx], 0); @@ -4838,26 +4856,26 @@ ASTReader::ReadTemplateName(PerFileData &F, const RecordData &Record, TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++]; switch (Kind) { case TemplateName::Template: - return TemplateName(cast_or_null(GetDecl(Record[Idx++]))); + return TemplateName(ReadDeclAs(F, Record, Idx)); case TemplateName::OverloadedTemplate: { unsigned size = Record[Idx++]; UnresolvedSet<8> Decls; while (size--) - Decls.addDecl(cast(GetDecl(Record[Idx++]))); + Decls.addDecl(ReadDeclAs(F, Record, Idx)); return Context->getOverloadedTemplateName(Decls.begin(), Decls.end()); } case TemplateName::QualifiedTemplate: { - NestedNameSpecifier *NNS = ReadNestedNameSpecifier(Record, Idx); + NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx); bool hasTemplKeyword = Record[Idx++]; - TemplateDecl *Template = cast(GetDecl(Record[Idx++])); + TemplateDecl *Template = ReadDeclAs(F, Record, Idx); return Context->getQualifiedTemplateName(NNS, hasTemplKeyword, Template); } case TemplateName::DependentTemplate: { - NestedNameSpecifier *NNS = ReadNestedNameSpecifier(Record, Idx); + NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx); if (Record[Idx++]) // isIdentifier return Context->getDependentTemplateName(NNS, GetIdentifierInfo(Record, Idx)); @@ -4867,7 +4885,7 @@ ASTReader::ReadTemplateName(PerFileData &F, const RecordData &Record, case TemplateName::SubstTemplateTemplateParm: { TemplateTemplateParmDecl *param - = cast_or_null(GetDecl(Record[Idx++])); + = ReadDeclAs(F, Record, Idx); if (!param) return TemplateName(); TemplateName replacement = ReadTemplateName(F, Record, Idx); return Context->getSubstTemplateTemplateParm(param, replacement); @@ -4875,7 +4893,7 @@ ASTReader::ReadTemplateName(PerFileData &F, const RecordData &Record, case TemplateName::SubstTemplateTemplateParmPack: { TemplateTemplateParmDecl *Param - = cast_or_null(GetDecl(Record[Idx++])); + = ReadDeclAs(F, Record, Idx); if (!Param) return TemplateName(); @@ -4901,7 +4919,7 @@ ASTReader::ReadTemplateArgument(PerFileData &F, case TemplateArgument::Type: return TemplateArgument(GetType(Record[Idx++])); case TemplateArgument::Declaration: - return TemplateArgument(GetDecl(Record[Idx++])); + return TemplateArgument(ReadDecl(F, Record, Idx)); case TemplateArgument::Integral: { llvm::APSInt Value = ReadAPSInt(Record, Idx); QualType T = GetType(Record[Idx++]); @@ -4942,7 +4960,7 @@ ASTReader::ReadTemplateParameterList(PerFileData &F, llvm::SmallVector Params; Params.reserve(NumParams); while (NumParams--) - Params.push_back(cast(GetDecl(Record[Idx++]))); + Params.push_back(ReadDeclAs(F, Record, Idx)); TemplateParameterList* TemplateParams = TemplateParameterList::Create(*Context, TemplateLoc, LAngleLoc, @@ -4962,11 +4980,11 @@ ReadTemplateArgumentList(llvm::SmallVector &TemplArgs, } /// \brief Read a UnresolvedSet structure. -void ASTReader::ReadUnresolvedSet(UnresolvedSetImpl &Set, +void ASTReader::ReadUnresolvedSet(PerFileData &F, UnresolvedSetImpl &Set, const RecordData &Record, unsigned &Idx) { unsigned NumDecls = Record[Idx++]; while (NumDecls--) { - NamedDecl *D = cast(GetDecl(Record[Idx++])); + NamedDecl *D = ReadDeclAs(F, Record, Idx); AccessSpecifier AS = (AccessSpecifier)Record[Idx++]; Set.addDecl(D, AS); } @@ -5013,15 +5031,15 @@ ASTReader::ReadCXXCtorInitializers(PerFileData &F, const RecordData &Record, break; case CTOR_INITIALIZER_DELEGATING: - Target = cast(GetDecl(Record[Idx++])); + Target = ReadDeclAs(F, Record, Idx); break; case CTOR_INITIALIZER_MEMBER: - Member = cast(GetDecl(Record[Idx++])); + Member = ReadDeclAs(F, Record, Idx); break; case CTOR_INITIALIZER_INDIRECT_MEMBER: - IndirectMember = cast(GetDecl(Record[Idx++])); + IndirectMember = ReadDeclAs(F, Record, Idx); break; } @@ -5038,7 +5056,7 @@ ASTReader::ReadCXXCtorInitializers(PerFileData &F, const RecordData &Record, SourceOrderOrNumArrayIndices = Record[Idx++]; Indices.reserve(SourceOrderOrNumArrayIndices); for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i) - Indices.push_back(cast(GetDecl(Record[Idx++]))); + Indices.push_back(ReadDeclAs(F, Record, Idx)); } CXXCtorInitializer *BOMInit; @@ -5073,7 +5091,8 @@ ASTReader::ReadCXXCtorInitializers(PerFileData &F, const RecordData &Record, } NestedNameSpecifier * -ASTReader::ReadNestedNameSpecifier(const RecordData &Record, unsigned &Idx) { +ASTReader::ReadNestedNameSpecifier(PerFileData &F, + const RecordData &Record, unsigned &Idx) { unsigned N = Record[Idx++]; NestedNameSpecifier *NNS = 0, *Prev = 0; for (unsigned I = 0; I != N; ++I) { @@ -5087,14 +5106,13 @@ ASTReader::ReadNestedNameSpecifier(const RecordData &Record, unsigned &Idx) { } case NestedNameSpecifier::Namespace: { - NamespaceDecl *NS = cast(GetDecl(Record[Idx++])); + NamespaceDecl *NS = ReadDeclAs(F, Record, Idx); NNS = NestedNameSpecifier::Create(*Context, Prev, NS); break; } case NestedNameSpecifier::NamespaceAlias: { - NamespaceAliasDecl *Alias - = cast(GetDecl(Record[Idx++])); + NamespaceAliasDecl *Alias =ReadDeclAs(F, Record, Idx); NNS = NestedNameSpecifier::Create(*Context, Prev, Alias); break; } @@ -5138,15 +5156,14 @@ ASTReader::ReadNestedNameSpecifierLoc(PerFileData &F, const RecordData &Record, } case NestedNameSpecifier::Namespace: { - NamespaceDecl *NS = cast(GetDecl(Record[Idx++])); + NamespaceDecl *NS = ReadDeclAs(F, Record, Idx); SourceRange Range = ReadSourceRange(F, Record, Idx); Builder.Extend(*Context, NS, Range.getBegin(), Range.getEnd()); break; } case NestedNameSpecifier::NamespaceAlias: { - NamespaceAliasDecl *Alias - = cast(GetDecl(Record[Idx++])); + NamespaceAliasDecl *Alias =ReadDeclAs(F, Record, Idx); SourceRange Range = ReadSourceRange(F, Record, Idx); Builder.Extend(*Context, Alias, Range.getBegin(), Range.getEnd()); break; @@ -5226,9 +5243,10 @@ VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record, return VersionTuple(Major, Minor - 1, Subminor - 1); } -CXXTemporary *ASTReader::ReadCXXTemporary(const RecordData &Record, +CXXTemporary *ASTReader::ReadCXXTemporary(PerFileData &F, + const RecordData &Record, unsigned &Idx) { - CXXDestructorDecl *Decl = cast(GetDecl(Record[Idx++])); + CXXDestructorDecl *Decl = ReadDeclAs(F, Record, Idx); return CXXTemporary::Create(*Context, Decl); } diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index 4f55d4625d47..8132ed9a5f02 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -43,23 +43,42 @@ namespace clang { DeclID LexicalDeclContextIDForTemplateParmDecl; uint64_t GetCurrentCursorOffset(); + SourceLocation ReadSourceLocation(const RecordData &R, unsigned &I) { return Reader.ReadSourceLocation(F, R, I); } + SourceRange ReadSourceRange(const RecordData &R, unsigned &I) { return Reader.ReadSourceRange(F, R, I); } + TypeSourceInfo *GetTypeSourceInfo(const RecordData &R, unsigned &I) { return Reader.GetTypeSourceInfo(F, R, I); } + + serialization::DeclID ReadDeclID(const RecordData &R, unsigned &I) { + return Reader.ReadDeclID(F, R, I); + } + + Decl *ReadDecl(const RecordData &R, unsigned &I) { + return Reader.ReadDecl(F, R, I); + } + + template + T *ReadDeclAs(const RecordData &R, unsigned &I) { + return Reader.ReadDeclAs(F, R, I); + } + void ReadQualifierInfo(QualifierInfo &Info, const RecordData &R, unsigned &I) { Reader.ReadQualifierInfo(F, Info, R, I); } + void ReadDeclarationNameLoc(DeclarationNameLoc &DNLoc, DeclarationName Name, const RecordData &R, unsigned &I) { Reader.ReadDeclarationNameLoc(F, DNLoc, Name, R, I); } + void ReadDeclarationNameInfo(DeclarationNameInfo &NameInfo, const RecordData &R, unsigned &I) { Reader.ReadDeclarationNameInfo(F, NameInfo, R, I); @@ -211,13 +230,12 @@ void ASTDeclReader::VisitDecl(Decl *D) { // parameter immediately, because the template parameter might be // used in the formulation of its DeclContext. Use the translation // unit DeclContext as a placeholder. - DeclContextIDForTemplateParmDecl = Record[Idx++]; - LexicalDeclContextIDForTemplateParmDecl = Record[Idx++]; + DeclContextIDForTemplateParmDecl = ReadDeclID(Record, Idx); + LexicalDeclContextIDForTemplateParmDecl = ReadDeclID(Record, Idx); D->setDeclContext(Reader.getContext()->getTranslationUnitDecl()); } else { - D->setDeclContext(cast_or_null(Reader.GetDecl(Record[Idx++]))); - D->setLexicalDeclContext( - cast_or_null(Reader.GetDecl(Record[Idx++]))); + D->setDeclContext(ReadDeclAs(Record, Idx)); + D->setLexicalDeclContext(ReadDeclAs(Record, Idx)); } D->setLocation(ReadSourceLocation(Record, Idx)); D->setInvalidDecl(Record[Idx++]); @@ -235,8 +253,7 @@ void ASTDeclReader::VisitDecl(Decl *D) { void ASTDeclReader::VisitTranslationUnitDecl(TranslationUnitDecl *TU) { VisitDecl(TU); - TU->setAnonymousNamespace( - cast_or_null(Reader.GetDecl(Record[Idx++]))); + TU->setAnonymousNamespace(ReadDeclAs(Record, Idx)); } void ASTDeclReader::VisitNamedDecl(NamedDecl *ND) { @@ -274,8 +291,7 @@ void ASTDeclReader::VisitTagDecl(TagDecl *TD) { ReadQualifierInfo(*Info, Record, Idx); TD->TypedefNameDeclOrQualifier = Info; } else - TD->setTypedefNameForAnonDecl( - cast_or_null(Reader.GetDecl(Record[Idx++]))); + TD->setTypedefNameForAnonDecl(ReadDeclAs(Record, Idx)); } void ASTDeclReader::VisitEnumDecl(EnumDecl *ED) { @@ -290,8 +306,7 @@ void ASTDeclReader::VisitEnumDecl(EnumDecl *ED) { ED->IsScoped = Record[Idx++]; ED->IsScopedUsingClassTag = Record[Idx++]; ED->IsFixed = Record[Idx++]; - ED->setInstantiationOfMemberEnum( - cast_or_null(Reader.GetDecl(Record[Idx++]))); + ED->setInstantiationOfMemberEnum(ReadDeclAs(Record, Idx)); } void ASTDeclReader::VisitRecordDecl(RecordDecl *RD) { @@ -336,11 +351,11 @@ void ASTDeclReader::VisitFunctionDecl(FunctionDecl *FD) { case FunctionDecl::TK_NonTemplate: break; case FunctionDecl::TK_FunctionTemplate: - FD->setDescribedFunctionTemplate( - cast(Reader.GetDecl(Record[Idx++]))); + FD->setDescribedFunctionTemplate(ReadDeclAs(Record, + Idx)); break; case FunctionDecl::TK_MemberSpecialization: { - FunctionDecl *InstFD = cast(Reader.GetDecl(Record[Idx++])); + FunctionDecl *InstFD = ReadDeclAs(Record, Idx); TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++]; SourceLocation POI = ReadSourceLocation(Record, Idx); FD->setInstantiationOfMemberFunction(*Reader.getContext(), InstFD, TSK); @@ -348,8 +363,8 @@ void ASTDeclReader::VisitFunctionDecl(FunctionDecl *FD) { break; } case FunctionDecl::TK_FunctionTemplateSpecialization: { - FunctionTemplateDecl *Template - = cast(Reader.GetDecl(Record[Idx++])); + FunctionTemplateDecl *Template = ReadDeclAs(Record, + Idx); TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++]; // Template arguments. @@ -389,7 +404,7 @@ void ASTDeclReader::VisitFunctionDecl(FunctionDecl *FD) { // The template that contains the specializations set. It's not safe to // use getCanonicalDecl on Template since it may still be initializing. FunctionTemplateDecl *CanonTemplate - = cast(Reader.GetDecl(Record[Idx++])); + = ReadDeclAs(Record, Idx); // Get the InsertPos by FindNodeOrInsertPos() instead of calling // InsertNode(FTInfo) directly to avoid the getASTContext() call in // FunctionTemplateSpecializationInfo's Profile(). @@ -410,7 +425,7 @@ void ASTDeclReader::VisitFunctionDecl(FunctionDecl *FD) { UnresolvedSet<8> TemplDecls; unsigned NumTemplates = Record[Idx++]; while (NumTemplates--) - TemplDecls.addDecl(cast(Reader.GetDecl(Record[Idx++]))); + TemplDecls.addDecl(ReadDeclAs(Record, Idx)); // Templates args. TemplateArgumentListInfo TemplArgs; @@ -449,7 +464,7 @@ void ASTDeclReader::VisitFunctionDecl(FunctionDecl *FD) { llvm::SmallVector Params; Params.reserve(NumParams); for (unsigned I = 0; I != NumParams; ++I) - Params.push_back(cast(Reader.GetDecl(Record[Idx++]))); + Params.push_back(ReadDeclAs(Record, Idx)); FD->setParams(*Reader.getContext(), Params.data(), NumParams); } @@ -459,8 +474,8 @@ void ASTDeclReader::VisitObjCMethodDecl(ObjCMethodDecl *MD) { // In practice, this won't be executed (since method definitions // don't occur in header files). MD->setBody(Reader.ReadStmt(F)); - MD->setSelfDecl(cast(Reader.GetDecl(Record[Idx++]))); - MD->setCmdDecl(cast(Reader.GetDecl(Record[Idx++]))); + MD->setSelfDecl(ReadDeclAs(Record, Idx)); + MD->setCmdDecl(ReadDeclAs(Record, Idx)); } MD->setInstanceMethod(Record[Idx++]); MD->setVariadic(Record[Idx++]); @@ -477,7 +492,7 @@ void ASTDeclReader::VisitObjCMethodDecl(ObjCMethodDecl *MD) { llvm::SmallVector Params; Params.reserve(NumParams); for (unsigned I = 0; I != NumParams; ++I) - Params.push_back(cast(Reader.GetDecl(Record[Idx++]))); + Params.push_back(ReadDeclAs(Record, Idx)); MD->setMethodParams(*Reader.getContext(), Params.data(), NumParams, NumParams); } @@ -492,15 +507,14 @@ void ASTDeclReader::VisitObjCContainerDecl(ObjCContainerDecl *CD) { void ASTDeclReader::VisitObjCInterfaceDecl(ObjCInterfaceDecl *ID) { VisitObjCContainerDecl(ID); ID->setTypeForDecl(Reader.GetType(Record[Idx++]).getTypePtrOrNull()); - ID->setSuperClass(cast_or_null - (Reader.GetDecl(Record[Idx++]))); + ID->setSuperClass(ReadDeclAs(Record, Idx)); // Read the directly referenced protocols and their SourceLocations. unsigned NumProtocols = Record[Idx++]; llvm::SmallVector Protocols; Protocols.reserve(NumProtocols); for (unsigned I = 0; I != NumProtocols; ++I) - Protocols.push_back(cast(Reader.GetDecl(Record[Idx++]))); + Protocols.push_back(ReadDeclAs(Record, Idx)); llvm::SmallVector ProtoLocs; ProtoLocs.reserve(NumProtocols); for (unsigned I = 0; I != NumProtocols; ++I) @@ -513,7 +527,7 @@ void ASTDeclReader::VisitObjCInterfaceDecl(ObjCInterfaceDecl *ID) { Protocols.clear(); Protocols.reserve(NumProtocols); for (unsigned I = 0; I != NumProtocols; ++I) - Protocols.push_back(cast(Reader.GetDecl(Record[Idx++]))); + Protocols.push_back(ReadDeclAs(Record, Idx)); ID->AllReferencedProtocols.set(Protocols.data(), NumProtocols, *Reader.getContext()); @@ -522,9 +536,9 @@ void ASTDeclReader::VisitObjCInterfaceDecl(ObjCInterfaceDecl *ID) { llvm::SmallVector IVars; IVars.reserve(NumIvars); for (unsigned I = 0; I != NumIvars; ++I) - IVars.push_back(cast(Reader.GetDecl(Record[Idx++]))); - ID->setCategoryList( - cast_or_null(Reader.GetDecl(Record[Idx++]))); + IVars.push_back(ReadDeclAs(Record, Idx)); + ID->setCategoryList(ReadDeclAs(Record, Idx)); + // We will rebuild this list lazily. ID->setIvarList(0); ID->setForwardDecl(Record[Idx++]); @@ -551,7 +565,7 @@ void ASTDeclReader::VisitObjCProtocolDecl(ObjCProtocolDecl *PD) { llvm::SmallVector ProtoRefs; ProtoRefs.reserve(NumProtoRefs); for (unsigned I = 0; I != NumProtoRefs; ++I) - ProtoRefs.push_back(cast(Reader.GetDecl(Record[Idx++]))); + ProtoRefs.push_back(ReadDeclAs(Record, Idx)); llvm::SmallVector ProtoLocs; ProtoLocs.reserve(NumProtoRefs); for (unsigned I = 0; I != NumProtoRefs; ++I) @@ -570,7 +584,7 @@ void ASTDeclReader::VisitObjCClassDecl(ObjCClassDecl *CD) { llvm::SmallVector ClassRefs; ClassRefs.reserve(NumClassRefs); for (unsigned I = 0; I != NumClassRefs; ++I) - ClassRefs.push_back(cast(Reader.GetDecl(Record[Idx++]))); + ClassRefs.push_back(ReadDeclAs(Record, Idx)); llvm::SmallVector SLocs; SLocs.reserve(NumClassRefs); for (unsigned I = 0; I != NumClassRefs; ++I) @@ -585,7 +599,7 @@ void ASTDeclReader::VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *FPD) { llvm::SmallVector ProtoRefs; ProtoRefs.reserve(NumProtoRefs); for (unsigned I = 0; I != NumProtoRefs; ++I) - ProtoRefs.push_back(cast(Reader.GetDecl(Record[Idx++]))); + ProtoRefs.push_back(ReadDeclAs(Record, Idx)); llvm::SmallVector ProtoLocs; ProtoLocs.reserve(NumProtoRefs); for (unsigned I = 0; I != NumProtoRefs; ++I) @@ -596,19 +610,19 @@ void ASTDeclReader::VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *FPD) { void ASTDeclReader::VisitObjCCategoryDecl(ObjCCategoryDecl *CD) { VisitObjCContainerDecl(CD); - CD->setClassInterface(cast(Reader.GetDecl(Record[Idx++]))); + CD->setClassInterface(ReadDeclAs(Record, Idx)); unsigned NumProtoRefs = Record[Idx++]; llvm::SmallVector ProtoRefs; ProtoRefs.reserve(NumProtoRefs); for (unsigned I = 0; I != NumProtoRefs; ++I) - ProtoRefs.push_back(cast(Reader.GetDecl(Record[Idx++]))); + ProtoRefs.push_back(ReadDeclAs(Record, Idx)); llvm::SmallVector ProtoLocs; ProtoLocs.reserve(NumProtoRefs); for (unsigned I = 0; I != NumProtoRefs; ++I) ProtoLocs.push_back(ReadSourceLocation(Record, Idx)); CD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(), *Reader.getContext()); - CD->setNextClassCategory(cast_or_null(Reader.GetDecl(Record[Idx++]))); + CD->setNextClassCategory(ReadDeclAs(Record, Idx)); CD->setHasSynthBitfield(Record[Idx++]); CD->setAtLoc(ReadSourceLocation(Record, Idx)); CD->setCategoryNameLoc(ReadSourceLocation(Record, Idx)); @@ -616,7 +630,7 @@ void ASTDeclReader::VisitObjCCategoryDecl(ObjCCategoryDecl *CD) { void ASTDeclReader::VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *CAD) { VisitNamedDecl(CAD); - CAD->setClassInterface(cast(Reader.GetDecl(Record[Idx++]))); + CAD->setClassInterface(ReadDeclAs(Record, Idx)); } void ASTDeclReader::VisitObjCPropertyDecl(ObjCPropertyDecl *D) { @@ -633,18 +647,14 @@ void ASTDeclReader::VisitObjCPropertyDecl(ObjCPropertyDecl *D) { (ObjCPropertyDecl::PropertyControl)Record[Idx++]); D->setGetterName(Reader.ReadDeclarationName(Record, Idx).getObjCSelector()); D->setSetterName(Reader.ReadDeclarationName(Record, Idx).getObjCSelector()); - D->setGetterMethodDecl( - cast_or_null(Reader.GetDecl(Record[Idx++]))); - D->setSetterMethodDecl( - cast_or_null(Reader.GetDecl(Record[Idx++]))); - D->setPropertyIvarDecl( - cast_or_null(Reader.GetDecl(Record[Idx++]))); + D->setGetterMethodDecl(ReadDeclAs(Record, Idx)); + D->setSetterMethodDecl(ReadDeclAs(Record, Idx)); + D->setPropertyIvarDecl(ReadDeclAs(Record, Idx)); } void ASTDeclReader::VisitObjCImplDecl(ObjCImplDecl *D) { VisitObjCContainerDecl(D); - D->setClassInterface( - cast_or_null(Reader.GetDecl(Record[Idx++]))); + D->setClassInterface(ReadDeclAs(Record, Idx)); } void ASTDeclReader::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) { @@ -654,8 +664,7 @@ void ASTDeclReader::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) { void ASTDeclReader::VisitObjCImplementationDecl(ObjCImplementationDecl *D) { VisitObjCImplDecl(D); - D->setSuperClass( - cast_or_null(Reader.GetDecl(Record[Idx++]))); + D->setSuperClass(ReadDeclAs(Record, Idx)); llvm::tie(D->IvarInitializers, D->NumIvarInitializers) = Reader.ReadCXXCtorInitializers(F, Record, Idx); D->setHasSynthBitfield(Record[Idx++]); @@ -665,10 +674,8 @@ void ASTDeclReader::VisitObjCImplementationDecl(ObjCImplementationDecl *D) { void ASTDeclReader::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) { VisitDecl(D); D->setAtLoc(ReadSourceLocation(Record, Idx)); - D->setPropertyDecl( - cast_or_null(Reader.GetDecl(Record[Idx++]))); - D->PropertyIvarDecl = - cast_or_null(Reader.GetDecl(Record[Idx++])); + D->setPropertyDecl(ReadDeclAs(Record, Idx)); + D->PropertyIvarDecl = ReadDeclAs(Record, Idx); D->IvarLoc = ReadSourceLocation(Record, Idx); D->setGetterCXXConstructor(Reader.ReadExpr(F)); D->setSetterCXXAssignment(Reader.ReadExpr(F)); @@ -683,8 +690,7 @@ void ASTDeclReader::VisitFieldDecl(FieldDecl *FD) { else if (BitWidthOrInitializer == 2) FD->setInClassInitializer(Reader.ReadExpr(F)); if (!FD->getDeclName()) { - FieldDecl *Tmpl = cast_or_null(Reader.GetDecl(Record[Idx++])); - if (Tmpl) + if (FieldDecl *Tmpl = ReadDeclAs(Record, Idx)) Reader.getContext()->setInstantiatedFromUnnamedFieldDecl(FD, Tmpl); } } @@ -697,7 +703,7 @@ void ASTDeclReader::VisitIndirectFieldDecl(IndirectFieldDecl *FD) { FD->Chaining = new (*Reader.getContext())NamedDecl*[FD->ChainingSize]; for (unsigned I = 0; I != FD->ChainingSize; ++I) - FD->Chaining[I] = cast(Reader.GetDecl(Record[Idx++])); + FD->Chaining[I] = ReadDeclAs(Record, Idx); } void ASTDeclReader::VisitVarDecl(VarDecl *VD) { @@ -715,7 +721,7 @@ void ASTDeclReader::VisitVarDecl(VarDecl *VD) { VD->setInit(Reader.ReadExpr(F)); if (Record[Idx++]) { // HasMemberSpecializationInfo. - VarDecl *Tmpl = cast(Reader.GetDecl(Record[Idx++])); + VarDecl *Tmpl = ReadDeclAs(Record, Idx); TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++]; SourceLocation POI = ReadSourceLocation(Record, Idx); Reader.getContext()->setInstantiatedFromStaticDataMember(VD, Tmpl, TSK,POI); @@ -759,7 +765,7 @@ void ASTDeclReader::VisitBlockDecl(BlockDecl *BD) { llvm::SmallVector Params; Params.reserve(NumParams); for (unsigned I = 0; I != NumParams; ++I) - Params.push_back(cast(Reader.GetDecl(Record[Idx++]))); + Params.push_back(ReadDeclAs(Record, Idx)); BD->setParams(Params.data(), NumParams); bool capturesCXXThis = Record[Idx++]; @@ -767,7 +773,7 @@ void ASTDeclReader::VisitBlockDecl(BlockDecl *BD) { llvm::SmallVector captures; captures.reserve(numCaptures); for (unsigned i = 0; i != numCaptures; ++i) { - VarDecl *decl = cast(Reader.GetDecl(Record[Idx++])); + VarDecl *decl = ReadDeclAs(Record, Idx); unsigned flags = Record[Idx++]; bool byRef = (flags & 1); bool nested = (flags & 2); @@ -800,9 +806,10 @@ void ASTDeclReader::VisitNamespaceDecl(NamespaceDecl *D) { D->NextNamespace = Record[Idx++]; bool IsOriginal = Record[Idx++]; + // FIXME: Modules will likely have trouble with pointing directly at + // the original namespace. D->OrigOrAnonNamespace.setInt(IsOriginal); - D->OrigOrAnonNamespace.setPointer( - cast_or_null(Reader.GetDecl(Record[Idx++]))); + D->OrigOrAnonNamespace.setPointer(ReadDeclAs(Record, Idx)); } void ASTDeclReader::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) { @@ -810,7 +817,7 @@ void ASTDeclReader::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) { D->NamespaceLoc = ReadSourceLocation(Record, Idx); D->IdentLoc = ReadSourceLocation(Record, Idx); D->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); - D->Namespace = cast(Reader.GetDecl(Record[Idx++])); + D->Namespace = ReadDeclAs(Record, Idx); } void ASTDeclReader::VisitUsingDecl(UsingDecl *D) { @@ -818,19 +825,17 @@ void ASTDeclReader::VisitUsingDecl(UsingDecl *D) { D->setUsingLocation(ReadSourceLocation(Record, Idx)); D->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); ReadDeclarationNameLoc(D->DNLoc, D->getDeclName(), Record, Idx); - D->FirstUsingShadow = cast_or_null(Reader.GetDecl(Record[Idx++])); + D->FirstUsingShadow = ReadDeclAs(Record, Idx); D->setTypeName(Record[Idx++]); - NamedDecl *Pattern = cast_or_null(Reader.GetDecl(Record[Idx++])); - if (Pattern) + if (NamedDecl *Pattern = ReadDeclAs(Record, Idx)) Reader.getContext()->setInstantiatedFromUsingDecl(D, Pattern); } void ASTDeclReader::VisitUsingShadowDecl(UsingShadowDecl *D) { VisitNamedDecl(D); - D->setTargetDecl(cast(Reader.GetDecl(Record[Idx++]))); - D->UsingOrNextShadow = cast_or_null(Reader.GetDecl(Record[Idx++])); - UsingShadowDecl *Pattern - = cast_or_null(Reader.GetDecl(Record[Idx++])); + D->setTargetDecl(ReadDeclAs(Record, Idx)); + D->UsingOrNextShadow = ReadDeclAs(Record, Idx); + UsingShadowDecl *Pattern = ReadDeclAs(Record, Idx); if (Pattern) Reader.getContext()->setInstantiatedFromUsingShadowDecl(D, Pattern); } @@ -840,8 +845,8 @@ void ASTDeclReader::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) { D->UsingLoc = ReadSourceLocation(Record, Idx); D->NamespaceLoc = ReadSourceLocation(Record, Idx); D->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); - D->NominatedNamespace = cast(Reader.GetDecl(Record[Idx++])); - D->CommonAncestor = cast_or_null(Reader.GetDecl(Record[Idx++])); + D->NominatedNamespace = ReadDeclAs(Record, Idx); + D->CommonAncestor = ReadDeclAs(Record, Idx); } void ASTDeclReader::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) { @@ -898,11 +903,10 @@ void ASTDeclReader::ReadCXXDefinitionData( if (Data.NumVBases) Data.VBases = Reader.GetCXXBaseSpecifiersOffset(Record[Idx++]); - Reader.ReadUnresolvedSet(Data.Conversions, Record, Idx); - Reader.ReadUnresolvedSet(Data.VisibleConversions, Record, Idx); + Reader.ReadUnresolvedSet(F, Data.Conversions, Record, Idx); + Reader.ReadUnresolvedSet(F, Data.VisibleConversions, Record, Idx); assert(Data.Definition && "Data.Definition should be already set!"); - Data.FirstFriend - = cast_or_null(Reader.GetDecl(Record[Idx++])); + Data.FirstFriend = ReadDeclAs(Record, Idx); } void ASTDeclReader::InitializeCXXDefinitionData(CXXRecordDecl *D, @@ -942,8 +946,7 @@ void ASTDeclReader::InitializeCXXDefinitionData(CXXRecordDecl *D, void ASTDeclReader::VisitCXXRecordDecl(CXXRecordDecl *D) { VisitRecordDecl(D); - CXXRecordDecl *DefinitionDecl - = cast_or_null(Reader.GetDecl(Record[Idx++])); + CXXRecordDecl *DefinitionDecl = ReadDeclAs(Record, Idx); InitializeCXXDefinitionData(D, DefinitionDecl, Record, Idx); ASTContext &C = *Reader.getContext(); @@ -957,11 +960,10 @@ void ASTDeclReader::VisitCXXRecordDecl(CXXRecordDecl *D) { case CXXRecNotTemplate: break; case CXXRecTemplate: - D->TemplateOrInstantiation - = cast(Reader.GetDecl(Record[Idx++])); + D->TemplateOrInstantiation = ReadDeclAs(Record, Idx); break; case CXXRecMemberSpecialization: { - CXXRecordDecl *RD = cast(Reader.GetDecl(Record[Idx++])); + CXXRecordDecl *RD = ReadDeclAs(Record, Idx); TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++]; SourceLocation POI = ReadSourceLocation(Record, Idx); MemberSpecializationInfo *MSI = new (C) MemberSpecializationInfo(RD, TSK); @@ -974,9 +976,7 @@ void ASTDeclReader::VisitCXXRecordDecl(CXXRecordDecl *D) { // Load the key function to avoid deserializing every method so we can // compute it. if (D->IsDefinition) { - CXXMethodDecl *Key - = cast_or_null(Reader.GetDecl(Record[Idx++])); - if (Key) + if (CXXMethodDecl *Key = ReadDeclAs(Record, Idx)) C.KeyFunctions[D] = Key; } } @@ -985,10 +985,10 @@ void ASTDeclReader::VisitCXXMethodDecl(CXXMethodDecl *D) { VisitFunctionDecl(D); unsigned NumOverridenMethods = Record[Idx++]; while (NumOverridenMethods--) { - CXXMethodDecl *MD = cast(Reader.GetDecl(Record[Idx++])); // Avoid invariant checking of CXXMethodDecl::addOverriddenMethod, // MD may be initializing. - Reader.getContext()->addOverriddenMethod(D, MD); + if (CXXMethodDecl *MD = ReadDeclAs(Record, Idx)) + Reader.getContext()->addOverriddenMethod(D, MD); } } @@ -1005,7 +1005,7 @@ void ASTDeclReader::VisitCXXDestructorDecl(CXXDestructorDecl *D) { VisitCXXMethodDecl(D); D->ImplicitlyDefined = Record[Idx++]; - D->OperatorDelete = cast_or_null(Reader.GetDecl(Record[Idx++])); + D->OperatorDelete = ReadDeclAs(Record, Idx); } void ASTDeclReader::VisitCXXConversionDecl(CXXConversionDecl *D) { @@ -1023,7 +1023,7 @@ void ASTDeclReader::VisitFriendDecl(FriendDecl *D) { if (Record[Idx++]) D->Friend = GetTypeSourceInfo(Record, Idx); else - D->Friend = cast(Reader.GetDecl(Record[Idx++])); + D->Friend = ReadDeclAs(Record, Idx); D->NextFriend = Record[Idx++]; D->UnsupportedFriend = (Record[Idx++] != 0); D->FriendLoc = ReadSourceLocation(Record, Idx); @@ -1037,7 +1037,7 @@ void ASTDeclReader::VisitFriendTemplateDecl(FriendTemplateDecl *D) { for (unsigned i = 0; i != NumParams; ++i) D->Params[i] = Reader.ReadTemplateParameterList(F, Record, Idx); if (Record[Idx++]) // HasFriendDecl - D->Friend = cast(Reader.GetDecl(Record[Idx++])); + D->Friend = ReadDeclAs(Record, Idx); else D->Friend = GetTypeSourceInfo(Record, Idx); D->FriendLoc = ReadSourceLocation(Record, Idx); @@ -1046,8 +1046,7 @@ void ASTDeclReader::VisitFriendTemplateDecl(FriendTemplateDecl *D) { void ASTDeclReader::VisitTemplateDecl(TemplateDecl *D) { VisitNamedDecl(D); - NamedDecl *TemplatedDecl - = cast_or_null(Reader.GetDecl(Record[Idx++])); + NamedDecl *TemplatedDecl = ReadDeclAs(Record, Idx); TemplateParameterList* TemplateParams = Reader.ReadTemplateParameterList(F, Record, Idx); D->init(TemplatedDecl, TemplateParams); @@ -1058,8 +1057,8 @@ void ASTDeclReader::VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D) { // can be used while this is still initializing. assert(D->CommonOrPrev.isNull() && "getCommonPtr was called earlier on this"); - DeclID PreviousDeclID = Record[Idx++]; - DeclID FirstDeclID = PreviousDeclID ? Record[Idx++] : 0; + DeclID PreviousDeclID = ReadDeclID(Record, Idx); + DeclID FirstDeclID = PreviousDeclID ? ReadDeclID(Record, Idx) : 0; // We delay loading of the redeclaration chain to avoid deeply nested calls. // We temporarily set the first (canonical) declaration as the previous one // which is the one that matters and mark the real previous DeclID to be @@ -1076,7 +1075,7 @@ void ASTDeclReader::VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D) { } else { D->CommonOrPrev = D->newCommon(*Reader.getContext()); if (RedeclarableTemplateDecl *RTD - = cast_or_null(Reader.GetDecl(Record[Idx++]))) { + = ReadDeclAs(Record, Idx)) { assert(RTD->getKind() == D->getKind() && "InstantiatedFromMemberTemplate kind mismatch"); D->setInstantiatedFromMemberTemplateImpl(RTD); @@ -1084,8 +1083,8 @@ void ASTDeclReader::VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D) { D->setMemberSpecialization(); } - RedeclarableTemplateDecl *LatestDecl = - cast_or_null(Reader.GetDecl(Record[Idx++])); + RedeclarableTemplateDecl *LatestDecl + = ReadDeclAs(Record, Idx); // This decl is a first one and the latest declaration that it points to is // in the same AST file. However, if this actually needs to point to a @@ -1125,14 +1124,14 @@ void ASTDeclReader::VisitClassTemplateDecl(ClassTemplateDecl *D) { // Specializations. unsigned Size = Record[Idx++]; SpecIDs[0] += Size; - SpecIDs.append(Record.begin() + Idx, Record.begin() + Idx + Size); - Idx += Size; + for (unsigned I = 0; I != Size; ++I) + SpecIDs.push_back(ReadDeclID(Record, Idx)); // Partial specializations. Size = Record[Idx++]; SpecIDs[0] += Size; - SpecIDs.append(Record.begin() + Idx, Record.begin() + Idx + Size); - Idx += Size; + for (unsigned I = 0; I != Size; ++I) + SpecIDs.push_back(ReadDeclID(Record, Idx)); if (SpecIDs[0]) { typedef serialization::DeclID DeclID; @@ -1153,7 +1152,7 @@ void ASTDeclReader::VisitClassTemplateSpecializationDecl( VisitCXXRecordDecl(D); ASTContext &C = *Reader.getContext(); - if (Decl *InstD = Reader.GetDecl(Record[Idx++])) { + if (Decl *InstD = ReadDecl(Record, Idx)) { if (ClassTemplateDecl *CTD = dyn_cast(InstD)) { D->SpecializedTemplate = CTD; } else { @@ -1190,8 +1189,7 @@ void ASTDeclReader::VisitClassTemplateSpecializationDecl( D->SpecializationKind = (TemplateSpecializationKind)Record[Idx++]; if (D->isCanonicalDecl()) { // It's kept in the folding set. - ClassTemplateDecl *CanonPattern - = cast(Reader.GetDecl(Record[Idx++])); + ClassTemplateDecl *CanonPattern = ReadDeclAs(Record,Idx); if (ClassTemplatePartialSpecializationDecl *Partial = dyn_cast(D)) { CanonPattern->getCommonPtr()->PartialSpecializations.InsertNode(Partial); @@ -1221,8 +1219,7 @@ void ASTDeclReader::VisitClassTemplatePartialSpecializationDecl( // These are read/set from/to the first declaration. if (D->getPreviousDeclaration() == 0) { D->InstantiatedFromMember.setPointer( - cast_or_null( - Reader.GetDecl(Record[Idx++]))); + ReadDeclAs(Record, Idx)); D->InstantiatedFromMember.setInt(Record[Idx++]); } } @@ -1238,7 +1235,7 @@ void ASTDeclReader::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) { // when reading the specialized FunctionDecl. unsigned NumSpecs = Record[Idx++]; while (NumSpecs--) - Reader.GetDecl(Record[Idx++]); + (void)ReadDecl(Record, Idx); } } @@ -1315,8 +1312,8 @@ void ASTDeclReader::VisitRedeclarable(Redeclarable *D) { case NoRedeclaration: break; case PointsToPrevious: { - DeclID PreviousDeclID = Record[Idx++]; - DeclID FirstDeclID = Record[Idx++]; + DeclID PreviousDeclID = ReadDeclID(Record, Idx); + DeclID FirstDeclID = ReadDeclID(Record, Idx); // We delay loading of the redeclaration chain to avoid deeply nested calls. // We temporarily set the first (canonical) declaration as the previous one // which is the one that matters and mark the real previous DeclID to be @@ -1330,7 +1327,7 @@ void ASTDeclReader::VisitRedeclarable(Redeclarable *D) { } case PointsToLatest: D->RedeclLink = typename Redeclarable::LatestDeclLink( - cast_or_null(Reader.GetDecl(Record[Idx++]))); + ReadDeclAs(Record, Idx)); break; } @@ -1761,24 +1758,23 @@ void ASTDeclReader::UpdateDecl(Decl *D, ASTReader::PerFileData &Module, switch ((DeclUpdateKind)Record[Idx++]) { case UPD_CXX_SET_DEFINITIONDATA: { CXXRecordDecl *RD = cast(D); - CXXRecordDecl * - DefinitionDecl = cast(Reader.GetDecl(Record[Idx++])); + CXXRecordDecl *DefinitionDecl = ReadDeclAs(Record, Idx); assert(!RD->DefinitionData && "DefinitionData is already set!"); InitializeCXXDefinitionData(RD, DefinitionDecl, Record, Idx); break; } case UPD_CXX_ADDED_IMPLICIT_MEMBER: - cast(D)->addedMember(Reader.GetDecl(Record[Idx++])); + cast(D)->addedMember(ReadDecl(Record, Idx)); break; case UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION: // It will be added to the template's specializations set when loaded. - Reader.GetDecl(Record[Idx++]); + (void)ReadDecl(Record, Idx); break; case UPD_CXX_ADDED_ANONYMOUS_NAMESPACE: { - NamespaceDecl *Anon = cast(Reader.GetDecl(Record[Idx++])); + NamespaceDecl *Anon = ReadDeclAs(Record, Idx); // Guard against these being loaded out of original order. Don't use // getNextNamespace(), since it tries to access the context and can't in // the middle of deserialization. diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp index 14927b9e3bc8..962fd2381187 100644 --- a/clang/lib/Serialization/ASTReaderStmt.cpp +++ b/clang/lib/Serialization/ASTReaderStmt.cpp @@ -22,27 +22,44 @@ using namespace clang::serialization; namespace clang { class ASTStmtReader : public StmtVisitor { + typedef ASTReader::RecordData RecordData; + ASTReader &Reader; ASTReader::PerFileData &F; llvm::BitstreamCursor &DeclsCursor; const ASTReader::RecordData &Record; unsigned &Idx; - SourceLocation ReadSourceLocation(const ASTReader::RecordData &R, - unsigned &I) { + SourceLocation ReadSourceLocation(const RecordData &R, unsigned &I) { return Reader.ReadSourceLocation(F, R, I); } - SourceRange ReadSourceRange(const ASTReader::RecordData &R, unsigned &I) { + + SourceRange ReadSourceRange(const RecordData &R, unsigned &I) { return Reader.ReadSourceRange(F, R, I); } - TypeSourceInfo *GetTypeSourceInfo(const ASTReader::RecordData &R, - unsigned &I) { + + TypeSourceInfo *GetTypeSourceInfo(const RecordData &R, unsigned &I) { return Reader.GetTypeSourceInfo(F, R, I); } + + serialization::DeclID ReadDeclID(const RecordData &R, unsigned &I) { + return Reader.ReadDeclID(F, R, I); + } + + Decl *ReadDecl(const RecordData &R, unsigned &I) { + return Reader.ReadDecl(F, R, I); + } + + template + T *ReadDeclAs(const RecordData &R, unsigned &I) { + return Reader.ReadDeclAs(F, R, I); + } + void ReadDeclarationNameLoc(DeclarationNameLoc &DNLoc, DeclarationName Name, const ASTReader::RecordData &R, unsigned &I) { Reader.ReadDeclarationNameLoc(F, DNLoc, Name, R, I); } + void ReadDeclarationNameInfo(DeclarationNameInfo &NameInfo, const ASTReader::RecordData &R, unsigned &I) { Reader.ReadDeclarationNameInfo(F, NameInfo, R, I); @@ -130,7 +147,7 @@ void ASTStmtReader::VisitDefaultStmt(DefaultStmt *S) { void ASTStmtReader::VisitLabelStmt(LabelStmt *S) { VisitStmt(S); - LabelDecl *LD = cast(Reader.GetDecl(Record[Idx++])); + LabelDecl *LD = ReadDeclAs(Record, Idx); LD->setStmt(S); S->setDecl(LD); S->setSubStmt(Reader.ReadSubStmt()); @@ -139,8 +156,8 @@ void ASTStmtReader::VisitLabelStmt(LabelStmt *S) { void ASTStmtReader::VisitIfStmt(IfStmt *S) { VisitStmt(S); - S->setConditionVariable(*Reader.getContext(), - cast_or_null(Reader.GetDecl(Record[Idx++]))); + S->setConditionVariable(*Reader.getContext(), + ReadDeclAs(Record, Idx)); S->setCond(Reader.ReadSubExpr()); S->setThen(Reader.ReadSubStmt()); S->setElse(Reader.ReadSubStmt()); @@ -151,7 +168,7 @@ void ASTStmtReader::VisitIfStmt(IfStmt *S) { void ASTStmtReader::VisitSwitchStmt(SwitchStmt *S) { VisitStmt(S); S->setConditionVariable(*Reader.getContext(), - cast_or_null(Reader.GetDecl(Record[Idx++]))); + ReadDeclAs(Record, Idx)); S->setCond(Reader.ReadSubExpr()); S->setBody(Reader.ReadSubStmt()); S->setSwitchLoc(ReadSourceLocation(Record, Idx)); @@ -173,7 +190,8 @@ void ASTStmtReader::VisitSwitchStmt(SwitchStmt *S) { void ASTStmtReader::VisitWhileStmt(WhileStmt *S) { VisitStmt(S); S->setConditionVariable(*Reader.getContext(), - cast_or_null(Reader.GetDecl(Record[Idx++]))); + ReadDeclAs(Record, Idx)); + S->setCond(Reader.ReadSubExpr()); S->setBody(Reader.ReadSubStmt()); S->setWhileLoc(ReadSourceLocation(Record, Idx)); @@ -193,7 +211,7 @@ void ASTStmtReader::VisitForStmt(ForStmt *S) { S->setInit(Reader.ReadSubStmt()); S->setCond(Reader.ReadSubExpr()); S->setConditionVariable(*Reader.getContext(), - cast_or_null(Reader.GetDecl(Record[Idx++]))); + ReadDeclAs(Record, Idx)); S->setInc(Reader.ReadSubExpr()); S->setBody(Reader.ReadSubStmt()); S->setForLoc(ReadSourceLocation(Record, Idx)); @@ -203,7 +221,7 @@ void ASTStmtReader::VisitForStmt(ForStmt *S) { void ASTStmtReader::VisitGotoStmt(GotoStmt *S) { VisitStmt(S); - S->setLabel(cast(Reader.GetDecl(Record[Idx++]))); + S->setLabel(ReadDeclAs(Record, Idx)); S->setGotoLoc(ReadSourceLocation(Record, Idx)); S->setLabelLoc(ReadSourceLocation(Record, Idx)); } @@ -229,7 +247,7 @@ void ASTStmtReader::VisitReturnStmt(ReturnStmt *S) { VisitStmt(S); S->setRetValue(Reader.ReadSubExpr()); S->setReturnLoc(ReadSourceLocation(Record, Idx)); - S->setNRVOCandidate(cast_or_null(Reader.GetDecl(Record[Idx++]))); + S->setNRVOCandidate(ReadDeclAs(Record, Idx)); } void ASTStmtReader::VisitDeclStmt(DeclStmt *S) { @@ -239,12 +257,12 @@ void ASTStmtReader::VisitDeclStmt(DeclStmt *S) { if (Idx + 1 == Record.size()) { // Single declaration - S->setDeclGroup(DeclGroupRef(Reader.GetDecl(Record[Idx++]))); + S->setDeclGroup(DeclGroupRef(ReadDecl(Record, Idx))); } else { llvm::SmallVector Decls; - Decls.reserve(Record.size() - Idx); - for (unsigned N = Record.size(); Idx != N; ++Idx) - Decls.push_back(Reader.GetDecl(Record[Idx])); + Decls.reserve(Record.size() - Idx); + for (unsigned N = Record.size(); Idx != N; ) + Decls.push_back(ReadDecl(Record, Idx)); S->setDeclGroup(DeclGroupRef(DeclGroup::Create(*Reader.getContext(), Decls.data(), Decls.size()))); @@ -318,13 +336,13 @@ void ASTStmtReader::VisitDeclRefExpr(DeclRefExpr *E) { = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); if (E->hasFoundDecl()) - E->getInternalFoundDecl() = cast(Reader.GetDecl(Record[Idx++])); + E->getInternalFoundDecl() = ReadDeclAs(Record, Idx); if (E->hasExplicitTemplateArgs()) ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(), NumTemplateArgs); - E->setDecl(cast(Reader.GetDecl(Record[Idx++]))); + E->setDecl(ReadDeclAs(Record, Idx)); E->setLocation(ReadSourceLocation(Record, Idx)); ReadDeclarationNameLoc(E->DNLoc, E->getDecl()->getDeclName(), Record, Idx); } @@ -418,10 +436,7 @@ void ASTStmtReader::VisitOffsetOfExpr(OffsetOfExpr *E) { break; case Node::Field: - E->setComponent(I, - Node(Start, - dyn_cast_or_null(Reader.GetDecl(Record[Idx++])), - End)); + E->setComponent(I, Node(Start, ReadDeclAs(Record, Idx), End)); break; case Node::Identifier: @@ -593,8 +608,7 @@ void ASTStmtReader::VisitInitListExpr(InitListExpr *E) { filler = Reader.ReadSubExpr(); E->ArrayFillerOrUnionFieldInit = filler; } else - E->ArrayFillerOrUnionFieldInit - = cast_or_null(Reader.GetDecl(Record[Idx++])); + E->ArrayFillerOrUnionFieldInit = ReadDeclAs(Record, Idx); E->sawArrayRangeDesignator(Record[Idx++]); unsigned NumInits = Record[Idx++]; E->reserveInits(*Reader.getContext(), NumInits); @@ -624,7 +638,7 @@ void ASTStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr *E) { while (Idx < Record.size()) { switch ((DesignatorTypes)Record[Idx++]) { case DESIG_FIELD_DECL: { - FieldDecl *Field = cast(Reader.GetDecl(Record[Idx++])); + FieldDecl *Field = ReadDeclAs(Record, Idx); SourceLocation DotLoc = ReadSourceLocation(Record, Idx); SourceLocation FieldLoc @@ -689,7 +703,7 @@ void ASTStmtReader::VisitAddrLabelExpr(AddrLabelExpr *E) { VisitExpr(E); E->setAmpAmpLoc(ReadSourceLocation(Record, Idx)); E->setLabelLoc(ReadSourceLocation(Record, Idx)); - E->setLabel(cast(Reader.GetDecl(Record[Idx++]))); + E->setLabel(ReadDeclAs(Record, Idx)); } void ASTStmtReader::VisitStmtExpr(StmtExpr *E) { @@ -726,12 +740,12 @@ void ASTStmtReader::VisitShuffleVectorExpr(ShuffleVectorExpr *E) { void ASTStmtReader::VisitBlockExpr(BlockExpr *E) { VisitExpr(E); - E->setBlockDecl(cast_or_null(Reader.GetDecl(Record[Idx++]))); + E->setBlockDecl(ReadDeclAs(Record, Idx)); } void ASTStmtReader::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) { VisitExpr(E); - E->setDecl(cast(Reader.GetDecl(Record[Idx++]))); + E->setDecl(ReadDeclAs(Record, Idx)); E->setLocation(ReadSourceLocation(Record, Idx)); E->setByRef(Record[Idx++]); E->setConstQualAdded(Record[Idx++]); @@ -781,14 +795,14 @@ void ASTStmtReader::VisitObjCSelectorExpr(ObjCSelectorExpr *E) { void ASTStmtReader::VisitObjCProtocolExpr(ObjCProtocolExpr *E) { VisitExpr(E); - E->setProtocol(cast(Reader.GetDecl(Record[Idx++]))); + E->setProtocol(ReadDeclAs(Record, Idx)); E->setAtLoc(ReadSourceLocation(Record, Idx)); E->setRParenLoc(ReadSourceLocation(Record, Idx)); } void ASTStmtReader::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) { VisitExpr(E); - E->setDecl(cast(Reader.GetDecl(Record[Idx++]))); + E->setDecl(ReadDeclAs(Record, Idx)); E->setLocation(ReadSourceLocation(Record, Idx)); E->setBase(Reader.ReadSubExpr()); E->setIsArrow(Record[Idx++]); @@ -799,14 +813,11 @@ void ASTStmtReader::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { VisitExpr(E); bool Implicit = Record[Idx++] != 0; if (Implicit) { - ObjCMethodDecl *Getter = - cast(Reader.GetDecl(Record[Idx++])); - ObjCMethodDecl *Setter = - cast(Reader.GetDecl(Record[Idx++])); + ObjCMethodDecl *Getter = ReadDeclAs(Record, Idx); + ObjCMethodDecl *Setter = ReadDeclAs(Record, Idx); E->setImplicitProperty(Getter, Setter); } else { - E->setExplicitProperty( - cast(Reader.GetDecl(Record[Idx++]))); + E->setExplicitProperty(ReadDeclAs(Record, Idx)); } E->setLocation(ReadSourceLocation(Record, Idx)); E->setReceiverLocation(ReadSourceLocation(Record, Idx)); @@ -818,8 +829,7 @@ void ASTStmtReader::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { E->setSuperReceiver(Reader.GetType(Record[Idx++])); break; case 2: - E->setClassReceiver( - cast(Reader.GetDecl(Record[Idx++]))); + E->setClassReceiver(ReadDeclAs(Record, Idx)); break; } } @@ -852,7 +862,7 @@ void ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) { assert(Kind == E->getReceiverKind()); if (Record[Idx++]) - E->setMethodDecl(cast_or_null(Reader.GetDecl(Record[Idx++]))); + E->setMethodDecl(ReadDeclAs(Record, Idx)); else E->setSelector(Reader.GetSelector(Record, Idx)); @@ -876,7 +886,7 @@ void ASTStmtReader::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) { void ASTStmtReader::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) { VisitStmt(S); S->setCatchBody(Reader.ReadSubStmt()); - S->setCatchParamDecl(cast_or_null(Reader.GetDecl(Record[Idx++]))); + S->setCatchParamDecl(ReadDeclAs(Record, Idx)); S->setAtCatchLoc(ReadSourceLocation(Record, Idx)); S->setRParenLoc(ReadSourceLocation(Record, Idx)); } @@ -927,7 +937,7 @@ void ASTStmtReader::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) { void ASTStmtReader::VisitCXXCatchStmt(CXXCatchStmt *S) { VisitStmt(S); S->CatchLoc = ReadSourceLocation(Record, Idx); - S->ExceptionDecl = cast_or_null(Reader.GetDecl(Record[Idx++])); + S->ExceptionDecl = ReadDeclAs(Record, Idx); S->HandlerBlock = Reader.ReadSubStmt(); } @@ -966,7 +976,7 @@ void ASTStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) { E->Args = new (*Reader.getContext()) Stmt*[E->NumArgs]; for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) E->setArg(I, Reader.ReadSubExpr()); - E->setConstructor(cast(Reader.GetDecl(Record[Idx++]))); + E->setConstructor(ReadDeclAs(Record, Idx)); E->setLocation(ReadSourceLocation(Record, Idx)); E->setElidable(Record[Idx++]); E->setRequiresZeroInitialization(Record[Idx++]); @@ -1050,13 +1060,13 @@ void ASTStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) { assert(Record[Idx] == E->Param.getInt() && "We messed up at creation ?"); ++Idx; // HasOtherExprStored and SubExpr was handled during creation. - E->Param.setPointer(cast(Reader.GetDecl(Record[Idx++]))); + E->Param.setPointer(ReadDeclAs(Record, Idx)); E->Loc = ReadSourceLocation(Record, Idx); } void ASTStmtReader::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { VisitExpr(E); - E->setTemporary(Reader.ReadCXXTemporary(Record, Idx)); + E->setTemporary(Reader.ReadCXXTemporary(F, Record, Idx)); E->setSubExpr(Reader.ReadSubExpr()); } @@ -1074,11 +1084,9 @@ void ASTStmtReader::VisitCXXNewExpr(CXXNewExpr *E) { bool isArray = Record[Idx++]; unsigned NumPlacementArgs = Record[Idx++]; unsigned NumCtorArgs = Record[Idx++]; - E->setOperatorNew(cast_or_null(Reader.GetDecl(Record[Idx++]))); - E->setOperatorDelete( - cast_or_null(Reader.GetDecl(Record[Idx++]))); - E->setConstructor( - cast_or_null(Reader.GetDecl(Record[Idx++]))); + E->setOperatorNew(ReadDeclAs(Record, Idx)); + E->setOperatorDelete(ReadDeclAs(Record, Idx)); + E->setConstructor(ReadDeclAs(Record, Idx)); E->AllocatedTypeInfo = GetTypeSourceInfo(Record, Idx); SourceRange TypeIdParens; TypeIdParens.setBegin(ReadSourceLocation(Record, Idx)); @@ -1104,7 +1112,7 @@ void ASTStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr *E) { E->ArrayForm = Record[Idx++]; E->ArrayFormAsWritten = Record[Idx++]; E->UsualArrayDeleteWantsSize = Record[Idx++]; - E->OperatorDelete = cast_or_null(Reader.GetDecl(Record[Idx++])); + E->OperatorDelete = ReadDeclAs(Record, Idx); E->Argument = Reader.ReadSubExpr(); E->Loc = ReadSourceLocation(Record, Idx); } @@ -1133,7 +1141,7 @@ void ASTStmtReader::VisitExprWithCleanups(ExprWithCleanups *E) { if (NumTemps) { E->setNumTemporaries(*Reader.getContext(), NumTemps); for (unsigned i = 0; i != NumTemps; ++i) - E->setTemporary(i, Reader.ReadCXXTemporary(Record, Idx)); + E->setTemporary(i, Reader.ReadCXXTemporary(F, Record, Idx)); } E->setSubExpr(Reader.ReadSubExpr()); } @@ -1151,8 +1159,7 @@ ASTStmtReader::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){ E->IsArrow = Record[Idx++]; E->OperatorLoc = ReadSourceLocation(Record, Idx); E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); - E->FirstQualifierFoundInScope - = cast_or_null(Reader.GetDecl(Record[Idx++])); + E->FirstQualifierFoundInScope = ReadDeclAs(Record, Idx); ReadDeclarationNameInfo(E->MemberNameInfo, Record, Idx); } @@ -1191,7 +1198,7 @@ void ASTStmtReader::VisitOverloadExpr(OverloadExpr *E) { unsigned NumDecls = Record[Idx++]; UnresolvedSet<8> Decls; for (unsigned i = 0; i != NumDecls; ++i) { - NamedDecl *D = cast(Reader.GetDecl(Record[Idx++])); + NamedDecl *D = ReadDeclAs(Record, Idx); AccessSpecifier AS = (AccessSpecifier)Record[Idx++]; Decls.addDecl(D, AS); } @@ -1216,7 +1223,7 @@ void ASTStmtReader::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) { if (E->RequiresADL) E->StdIsAssociatedNamespace = Record[Idx++]; E->Overloaded = Record[Idx++]; - E->NamingClass = cast_or_null(Reader.GetDecl(Record[Idx++])); + E->NamingClass = ReadDeclAs(Record, Idx); } void ASTStmtReader::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) { @@ -1280,14 +1287,13 @@ void ASTStmtReader::VisitSizeOfPackExpr(SizeOfPackExpr *E) { E->PackLoc = ReadSourceLocation(Record, Idx); E->RParenLoc = ReadSourceLocation(Record, Idx); E->Length = Record[Idx++]; - E->Pack = cast_or_null(Reader.GetDecl(Record[Idx++])); + E->Pack = ReadDeclAs(Record, Idx); } void ASTStmtReader::VisitSubstNonTypeTemplateParmExpr( SubstNonTypeTemplateParmExpr *E) { VisitExpr(E); - E->Param - = cast_or_null(Reader.GetDecl(Record[Idx++])); + E->Param = ReadDeclAs(Record, Idx); E->NameLoc = ReadSourceLocation(Record, Idx); E->Replacement = Reader.ReadSubExpr(); } @@ -1295,8 +1301,7 @@ void ASTStmtReader::VisitSubstNonTypeTemplateParmExpr( void ASTStmtReader::VisitSubstNonTypeTemplateParmPackExpr( SubstNonTypeTemplateParmPackExpr *E) { VisitExpr(E); - E->Param - = cast_or_null(Reader.GetDecl(Record[Idx++])); + E->Param = ReadDeclAs(Record, Idx); TemplateArgument ArgPack = Reader.ReadTemplateArgument(F, Record, Idx); if (ArgPack.getKind() != TemplateArgument::Pack) return; @@ -1611,7 +1616,7 @@ Stmt *ASTReader::ReadStmtFromStream(PerFileData &F) { ArgInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Idx)); } - NamedDecl *FoundD = cast_or_null(GetDecl(Record[Idx++])); + NamedDecl *FoundD = ReadDeclAs(F, Record, Idx); AccessSpecifier AS = (AccessSpecifier)Record[Idx++]; DeclAccessPair FoundDecl = DeclAccessPair::make(FoundD, AS); @@ -1619,7 +1624,7 @@ Stmt *ASTReader::ReadStmtFromStream(PerFileData &F) { ExprValueKind VK = static_cast(Record[Idx++]); ExprObjectKind OK = static_cast(Record[Idx++]); Expr *Base = ReadSubExpr(); - ValueDecl *MemberD = cast(GetDecl(Record[Idx++])); + ValueDecl *MemberD = ReadDeclAs(F, Record, Idx); SourceLocation MemberLoc = ReadSourceLocation(F, Record, Idx); DeclarationNameInfo MemberNameInfo(MemberD->getDeclName(), MemberLoc); bool IsArrow = Record[Idx++];