r233045 - When looking for lexical decls from an external source, check all contexts

Richard Smith richard-llvm at metafoo.co.uk
Mon Mar 23 19:44:20 PDT 2015


Author: rsmith
Date: Mon Mar 23 21:44:20 2015
New Revision: 233045

URL: http://llvm.org/viewvc/llvm-project?rev=233045&view=rev
Log:
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.

Modified:
    cfe/trunk/include/clang/AST/DeclBase.h
    cfe/trunk/lib/AST/DeclBase.cpp

Modified: cfe/trunk/include/clang/AST/DeclBase.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclBase.h?rev=233045&r1=233044&r2=233045&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/DeclBase.h (original)
+++ cfe/trunk/include/clang/AST/DeclBase.h Mon Mar 23 21:44:20 2015
@@ -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

Modified: cfe/trunk/lib/AST/DeclBase.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclBase.cpp?rev=233045&r1=233044&r2=233045&view=diff
==============================================================================
--- cfe/trunk/lib/AST/DeclBase.cpp (original)
+++ cfe/trunk/lib/AST/DeclBase.cpp Mon Mar 23 21:44:20 2015
@@ -1020,7 +1020,8 @@ void DeclContext::reconcileExternalVisib
 
 /// \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::LoadLexicalDeclsFromExterna
   // 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::LoadLexicalDeclsFromExterna
   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;





More information about the cfe-commits mailing list