|
@@ -1263,15 +1263,13 @@ static bool shouldBeHidden(NamedDecl *D) {
|
|
|
StoredDeclsMap *DeclContext::buildLookup() {
|
|
|
assert(this == getPrimaryContext() && "buildLookup called on non-primary DC");
|
|
|
|
|
|
- // FIXME: Should we keep going if hasExternalVisibleStorage?
|
|
|
if (!LookupPtr.getInt())
|
|
|
return LookupPtr.getPointer();
|
|
|
|
|
|
SmallVector<DeclContext *, 2> Contexts;
|
|
|
collectAllContexts(Contexts);
|
|
|
for (unsigned I = 0, N = Contexts.size(); I != N; ++I)
|
|
|
- buildLookupImpl<&DeclContext::decls_begin,
|
|
|
- &DeclContext::decls_end>(Contexts[I], false);
|
|
|
+ buildLookupImpl(Contexts[I], hasExternalVisibleStorage());
|
|
|
|
|
|
// We no longer have any lazy decls.
|
|
|
LookupPtr.setInt(false);
|
|
@@ -1282,13 +1280,8 @@ StoredDeclsMap *DeclContext::buildLookup() {
|
|
|
/// declarations contained within DCtx, which will either be this
|
|
|
/// DeclContext, a DeclContext linked to it, or a transparent context
|
|
|
/// nested within it.
|
|
|
-template<DeclContext::decl_iterator (DeclContext::*Begin)() const,
|
|
|
- DeclContext::decl_iterator (DeclContext::*End)() const>
|
|
|
void DeclContext::buildLookupImpl(DeclContext *DCtx, bool Internal) {
|
|
|
- for (decl_iterator I = (DCtx->*Begin)(), E = (DCtx->*End)();
|
|
|
- I != E; ++I) {
|
|
|
- Decl *D = *I;
|
|
|
-
|
|
|
+ for (Decl *D : DCtx->noload_decls()) {
|
|
|
// Insert this declaration into the lookup structure, but only if
|
|
|
// it's semantically within its decl context. Any other decls which
|
|
|
// should be found in this context are added eagerly.
|
|
@@ -1309,7 +1302,7 @@ void DeclContext::buildLookupImpl(DeclContext *DCtx, bool Internal) {
|
|
|
// context (recursively).
|
|
|
if (DeclContext *InnerCtx = dyn_cast<DeclContext>(D))
|
|
|
if (InnerCtx->isTransparentContext() || InnerCtx->isInlineNamespace())
|
|
|
- buildLookupImpl<Begin, End>(InnerCtx, Internal);
|
|
|
+ buildLookupImpl(InnerCtx, Internal);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1388,26 +1381,8 @@ DeclContext::noload_lookup(DeclarationName Name) {
|
|
|
if (PrimaryContext != this)
|
|
|
return PrimaryContext->noload_lookup(Name);
|
|
|
|
|
|
- StoredDeclsMap *Map = LookupPtr.getPointer();
|
|
|
- if (LookupPtr.getInt()) {
|
|
|
- // Carefully build the lookup map, without deserializing anything.
|
|
|
- SmallVector<DeclContext *, 2> Contexts;
|
|
|
- collectAllContexts(Contexts);
|
|
|
- for (unsigned I = 0, N = Contexts.size(); I != N; ++I)
|
|
|
- buildLookupImpl<&DeclContext::noload_decls_begin,
|
|
|
- &DeclContext::noload_decls_end>(Contexts[I], true);
|
|
|
-
|
|
|
- // We no longer have any lazy decls.
|
|
|
- LookupPtr.setInt(false);
|
|
|
-
|
|
|
- // There may now be names for which we have local decls but are
|
|
|
- // missing the external decls. FIXME: Just set the hasExternalDecls
|
|
|
- // flag on those names that have external decls.
|
|
|
- NeedToReconcileExternalVisibleStorage = true;
|
|
|
-
|
|
|
- Map = LookupPtr.getPointer();
|
|
|
- }
|
|
|
-
|
|
|
+ // Note that buildLookups does not trigger any deserialization.
|
|
|
+ StoredDeclsMap *Map = buildLookup();
|
|
|
if (!Map)
|
|
|
return lookup_result();
|
|
|
|