]> granicus.if.org Git - clang/commitdiff
When looking for lexical decls from an external source, check all contexts
authorRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 24 Mar 2015 02:44:20 +0000 (02:44 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 24 Mar 2015 02:44:20 +0000 (02:44 +0000)
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
lib/AST/DeclBase.cpp

index 7088e4a8d155cf270984b4bf4e7e860728b20e5d..3c61c1ea833338baf28ad801aea7ca739eb5628e 100644 (file)
@@ -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
index 1f08a64d3ab35690e6df841267f54f4cc5098848..87d0b3912f7d77d6504c425632d1fd886cf423fd 100644 (file)
@@ -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<Decl*, 64> 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<DeclContext *, 2> 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;