From: Douglas Gregor Date: Thu, 28 Jul 2011 19:26:52 +0000 (+0000) Subject: Promote the deserialized PendingInstantiations vector from being a X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f2abb52acbba25ad93a1ecdc24d994b9694803a1;p=clang Promote the deserialized PendingInstantiations vector from being a Module member to being an ASTReader member; we want it to be centralized for lazy deserialization. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@136373 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Serialization/ASTReader.h b/include/clang/Serialization/ASTReader.h index f3bdcc8c2f..7af22548db 100644 --- a/include/clang/Serialization/ASTReader.h +++ b/include/clang/Serialization/ASTReader.h @@ -343,15 +343,7 @@ public: /// \brief Offset of each declaration within the bitstream, indexed /// by the declaration ID (-1). const uint32_t *DeclOffsets; - - /// \brief A snapshot of the pending instantiations in the chain. - /// - /// This record tracks the instantiations that Sema has to perform at the - /// end of the TU. It consists of a pair of values for every pending - /// instantiation where the first value is the ID of the decl and the second - /// is the instantiation location. - SmallVector PendingInstantiations; - + /// \brief The number of C++ base specifier sets in this AST file. unsigned LocalNumCXXBaseSpecifiers; @@ -737,6 +729,14 @@ private: /// deserialized. SmallVector VTableUses; + /// \brief A snapshot of the pending instantiations in the chain. + /// + /// This record tracks the instantiations that Sema has to perform at the + /// end of the TU. It consists of a pair of values for every pending + /// instantiation where the first value is the ID of the decl and the second + /// is the instantiation location. + SmallVector PendingInstantiations; + //@} /// \name Diagnostic-relevant special data diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 288e50df74..eced16a6ca 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -2334,8 +2334,19 @@ ASTReader::ReadASTBlock(Module &F) { break; case PENDING_IMPLICIT_INSTANTIATIONS: - for (unsigned I = 0, N = Record.size(); I != N; ++I) - F.PendingInstantiations.push_back(getGlobalDeclID(F, Record[I])); + if (PendingInstantiations.size() % 2 != 0) { + Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block"); + return Failure; + } + + // Later lists of pending instantiations overwrite earlier ones. + // FIXME: This is most certainly wrong for modules. + PendingInstantiations.clear(); + for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { + PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++])); + PendingInstantiations.push_back( + ReadSourceLocation(F, Record, I).getRawEncoding()); + } break; case SEMA_DECL_REFS: @@ -4394,17 +4405,12 @@ void ASTReader::InitializeSema(Sema &S) { SemaObj->StdBadAlloc = SemaDeclRefs[1]; } - // The special data sets below always come from the most recent PCH, - // which is at the front of the chain. - Module &F = ModuleMgr.getPrimaryModule(); - // If there were any pending implicit instantiations, deserialize them // and add them to Sema's queue of such instantiations. - assert(F.PendingInstantiations.size() % 2 == 0 && - "Expected pairs of entries"); - for (unsigned Idx = 0, N = F.PendingInstantiations.size(); Idx < N;) { - ValueDecl *D=cast(GetDecl(F.PendingInstantiations[Idx++])); - SourceLocation Loc = ReadSourceLocation(F, F.PendingInstantiations,Idx); + for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) { + ValueDecl *D = cast(GetDecl(PendingInstantiations[Idx++])); + SourceLocation Loc + = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]); SemaObj->PendingInstantiations.push_back(std::make_pair(D, Loc)); }