From c850c7e1887debd28a8da94d80afc1ce45256665 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Tue, 24 Mar 2015 02:44:20 +0000 Subject: [PATCH] When looking for lexical decls from an external source, check all contexts rather than just the primary context. This is technically correct but results in no functionality change (in Clang nor LLDB) because all users of this functionality only use it on single-context DCs. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@233045 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/DeclBase.h | 2 +- lib/AST/DeclBase.cpp | 36 +++++++++++++++++++++--------------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/include/clang/AST/DeclBase.h b/include/clang/AST/DeclBase.h index 7088e4a8d1..3c61c1ea83 100644 --- a/include/clang/AST/DeclBase.h +++ b/include/clang/AST/DeclBase.h @@ -1722,7 +1722,7 @@ public: private: void reconcileExternalVisibleStorage() const; - void LoadLexicalDeclsFromExternalStorage() const; + bool LoadLexicalDeclsFromExternalStorage() const; /// @brief Makes a declaration visible within this context, but /// suppresses searches for external declarations with the same diff --git a/lib/AST/DeclBase.cpp b/lib/AST/DeclBase.cpp index 1f08a64d3a..87d0b3912f 100644 --- a/lib/AST/DeclBase.cpp +++ b/lib/AST/DeclBase.cpp @@ -1020,7 +1020,8 @@ void DeclContext::reconcileExternalVisibleStorage() const { /// \brief Load the declarations within this lexical storage from an /// external source. -void +/// \return \c true if any declarations were added. +bool DeclContext::LoadLexicalDeclsFromExternalStorage() const { ExternalASTSource *Source = getParentASTContext().getExternalSource(); assert(hasExternalLexicalStorage() && Source && "No external storage?"); @@ -1028,26 +1029,20 @@ DeclContext::LoadLexicalDeclsFromExternalStorage() const { // Notify that we have a DeclContext that is initializing. ExternalASTSource::Deserializing ADeclContext(Source); - ExternalLexicalStorage = false; - bool HadLazyExternalLexicalLookups = HasLazyExternalLexicalLookups; - HasLazyExternalLexicalLookups = false; - // Load the external declarations, if any. SmallVector Decls; + ExternalLexicalStorage = false; switch (Source->FindExternalLexicalDecls(this, Decls)) { case ELR_Success: break; case ELR_Failure: case ELR_AlreadyLoaded: - return; + return false; } if (Decls.empty()) - return; - - if (HadLazyExternalLexicalLookups) - HasLazyLocalLexicalLookups = true; + return false; // We may have already loaded just the fields of this record, in which case // we need to ignore them. @@ -1064,6 +1059,7 @@ DeclContext::LoadLexicalDeclsFromExternalStorage() const { FirstDecl = ExternalFirst; if (!LastDecl) LastDecl = ExternalLast; + return true; } DeclContext::lookup_result @@ -1272,13 +1268,23 @@ StoredDeclsMap *DeclContext::buildLookup() { if (!HasLazyLocalLexicalLookups && !HasLazyExternalLexicalLookups) return LookupPtr; - if (HasLazyExternalLexicalLookups) - LoadLexicalDeclsFromExternalStorage(); - SmallVector Contexts; collectAllContexts(Contexts); - for (unsigned I = 0, N = Contexts.size(); I != N; ++I) - buildLookupImpl(Contexts[I], hasExternalVisibleStorage()); + + if (HasLazyExternalLexicalLookups) { + HasLazyExternalLexicalLookups = false; + for (auto *DC : Contexts) { + if (DC->hasExternalLexicalStorage()) + HasLazyLocalLexicalLookups |= + DC->LoadLexicalDeclsFromExternalStorage(); + } + + if (!HasLazyLocalLexicalLookups) + return LookupPtr; + } + + for (auto *DC : Contexts) + buildLookupImpl(DC, hasExternalVisibleStorage()); // We no longer have any lazy decls. HasLazyLocalLexicalLookups = false; -- 2.40.0