From: Douglas Gregor Date: Fri, 26 Aug 2011 22:04:51 +0000 (+0000) Subject: Teach the ASTReader how to avoid cycles when loading declarations that X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2ea054fbc59ed19b8e3304e7e7cbdd56a5a5120f;p=clang Teach the ASTReader how to avoid cycles when loading declarations that are lexically within a particular DeclContext. Test forthcoming. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@138668 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/DeclBase.h b/include/clang/AST/DeclBase.h index 042c50f2a8..8dc15de0f8 100644 --- a/include/clang/AST/DeclBase.h +++ b/include/clang/AST/DeclBase.h @@ -1322,6 +1322,12 @@ public: ExternalVisibleStorage = ES; } + /// \brief Determine whether the given declaration is stored in the list of + /// declarations lexically within this context. + bool isDeclInLexicalTraversal(const Decl *D) const { + return D && (D->NextDeclInContext || D == FirstDecl || D == LastDecl); + } + static bool classof(const Decl *D); static bool classof(const DeclContext *D) { return true; } #define DECL(NAME, BASE) diff --git a/include/clang/Lex/ModuleLoader.h b/include/clang/Lex/ModuleLoader.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 540b9ef034..c991cc0776 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -2553,7 +2553,7 @@ namespace { = static_cast(UserData); ASTIdentifierLookupTable *IdTable - = (ASTIdentifierLookupTable *)M.IdentifierLookupTable; + = (ASTIdentifierLookupTable *)M.IdentifierLookupTable; if (!IdTable) return false; @@ -2786,7 +2786,7 @@ void ASTReader::setPreprocessor(Preprocessor &pp) { void ASTReader::InitializeContext(ASTContext &Ctx) { Context = &Ctx; assert(Context && "Passed null context!"); - + assert(PP && "Forgot to set Preprocessor ?"); PP->getIdentifierTable().setExternalIdentifierLookup(this); PP->setExternalSource(this); @@ -4163,6 +4163,7 @@ namespace { ASTReader &Reader; const DeclContext *DC; bool (*isKindWeWant)(Decl::Kind); + SmallVectorImpl &Decls; bool PredefsVisited[NUM_PREDEF_DECL_IDS]; @@ -4204,9 +4205,10 @@ namespace { This->PredefsVisited[ID->second] = true; } - Decl *D = This->Reader.GetLocalDecl(M, ID->second); - assert(D && "Null decl in lexical decls"); - This->Decls.push_back(D); + if (Decl *D = This->Reader.GetLocalDecl(M, ID->second)) { + if (!This->DC->isDeclInLexicalTraversal(D)) + This->Decls.push_back(D); + } } return false;