diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Serialization/ASTReader.cpp | 12 | ||||
-rw-r--r-- | lib/Serialization/ASTReaderDecl.cpp | 18 |
2 files changed, 16 insertions, 14 deletions
diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 6f0dcaae30..ee558dce08 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -6986,7 +6986,7 @@ void ASTReader::ReadComments() { void ASTReader::finishPendingActions() { while (!PendingIdentifierInfos.empty() || !PendingDeclChains.empty() || - !PendingMacroIDs.empty()) { + !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty()) { // If any identifiers with corresponding top-level declarations have // been loaded, load those declarations now. while (!PendingIdentifierInfos.empty()) { @@ -7013,6 +7013,16 @@ void ASTReader::finishPendingActions() { } } PendingMacroIDs.clear(); + + // Wire up the DeclContexts for Decls that we delayed setting until + // recursive loading is completed. + while (!PendingDeclContextInfos.empty()) { + PendingDeclContextInfo Info = PendingDeclContextInfos.front(); + PendingDeclContextInfos.pop_front(); + DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC)); + DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC)); + Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext()); + } } // If we deserialized any C++ or Objective-C class definitions, any diff --git a/lib/Serialization/ASTReaderDecl.cpp b/lib/Serialization/ASTReaderDecl.cpp index 64b33b066b..ea549396f3 100644 --- a/lib/Serialization/ASTReaderDecl.cpp +++ b/lib/Serialization/ASTReaderDecl.cpp @@ -44,9 +44,6 @@ namespace clang { unsigned &Idx; TypeID TypeIDForTypeDecl; - DeclID DeclContextIDForTemplateParmDecl; - DeclID LexicalDeclContextIDForTemplateParmDecl; - bool HasPendingBody; uint64_t GetCurrentCursorOffset(); @@ -329,14 +326,6 @@ void ASTDeclReader::Visit(Decl *D) { Reader.PendingBodies[FD] = GetCurrentCursorOffset(); HasPendingBody = true; } - } else if (D->isTemplateParameter()) { - // If we have a fully initialized template parameter, we can now - // set its DeclContext. - DeclContext *SemaDC = cast<DeclContext>( - Reader.GetDecl(DeclContextIDForTemplateParmDecl)); - DeclContext *LexicalDC = cast<DeclContext>( - Reader.GetDecl(LexicalDeclContextIDForTemplateParmDecl)); - D->setDeclContextsImpl(SemaDC, LexicalDC, Reader.getContext()); } } @@ -346,8 +335,11 @@ 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 = ReadDeclID(Record, Idx); - LexicalDeclContextIDForTemplateParmDecl = ReadDeclID(Record, Idx); + GlobalDeclID SemaDCIDForTemplateParmDecl = ReadDeclID(Record, Idx); + GlobalDeclID LexicalDCIDForTemplateParmDecl = ReadDeclID(Record, Idx); + Reader.addPendingDeclContextInfo(D, + SemaDCIDForTemplateParmDecl, + LexicalDCIDForTemplateParmDecl); D->setDeclContext(Reader.getContext().getTranslationUnitDecl()); } else { DeclContext *SemaDC = ReadDeclAs<DeclContext>(Record, Idx); |