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