From 5184f75755f8bd517922e74b7bcbc48b7455f71f Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Sat, 7 Feb 2015 00:45:52 +0000 Subject: [PATCH] [modules] Don't accidentally trigger deserialization from DeclContext::noload_lookup. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@228475 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/DeclBase.h | 2 +- lib/AST/DeclBase.cpp | 12 ++++++------ test/Modules/Inputs/deferred-lookup/a.h | 1 + test/Modules/Inputs/deferred-lookup/b.h | 6 ++++++ test/Modules/Inputs/deferred-lookup/module.modulemap | 2 ++ test/Modules/deferred-lookup.cpp | 6 ++++++ 6 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 test/Modules/Inputs/deferred-lookup/a.h create mode 100644 test/Modules/Inputs/deferred-lookup/b.h create mode 100644 test/Modules/Inputs/deferred-lookup/module.modulemap create mode 100644 test/Modules/deferred-lookup.cpp diff --git a/include/clang/AST/DeclBase.h b/include/clang/AST/DeclBase.h index 984ab13df4..93f6a6fa0f 100644 --- a/include/clang/AST/DeclBase.h +++ b/include/clang/AST/DeclBase.h @@ -1672,7 +1672,7 @@ private: template - void buildLookupImpl(DeclContext *DCtx); + void buildLookupImpl(DeclContext *DCtx, bool Internal); void makeDeclVisibleInContextWithFlags(NamedDecl *D, bool Internal, bool Rediscoverable); void makeDeclVisibleInContextImpl(NamedDecl *D, bool Internal); diff --git a/lib/AST/DeclBase.cpp b/lib/AST/DeclBase.cpp index a46787fb0e..8862f9f5c6 100644 --- a/lib/AST/DeclBase.cpp +++ b/lib/AST/DeclBase.cpp @@ -1251,7 +1251,7 @@ StoredDeclsMap *DeclContext::buildLookup() { collectAllContexts(Contexts); for (unsigned I = 0, N = Contexts.size(); I != N; ++I) buildLookupImpl<&DeclContext::decls_begin, - &DeclContext::decls_end>(Contexts[I]); + &DeclContext::decls_end>(Contexts[I], false); // We no longer have any lazy decls. LookupPtr.setInt(false); @@ -1264,7 +1264,7 @@ StoredDeclsMap *DeclContext::buildLookup() { /// nested within it. template -void DeclContext::buildLookupImpl(DeclContext *DCtx) { +void DeclContext::buildLookupImpl(DeclContext *DCtx, bool Internal) { for (decl_iterator I = (DCtx->*Begin)(), E = (DCtx->*End)(); I != E; ++I) { Decl *D = *I; @@ -1282,14 +1282,14 @@ void DeclContext::buildLookupImpl(DeclContext *DCtx) { (!ND->isFromASTFile() || (isTranslationUnit() && !getParentASTContext().getLangOpts().CPlusPlus))) - makeDeclVisibleInContextImpl(ND, false); + makeDeclVisibleInContextImpl(ND, Internal); // If this declaration is itself a transparent declaration context // or inline namespace, add the members of this declaration of that // context (recursively). if (DeclContext *InnerCtx = dyn_cast(D)) if (InnerCtx->isTransparentContext() || InnerCtx->isInlineNamespace()) - buildLookupImpl(InnerCtx); + buildLookupImpl(InnerCtx, Internal); } } @@ -1369,7 +1369,7 @@ DeclContext::noload_lookup(DeclarationName Name) { collectAllContexts(Contexts); for (unsigned I = 0, N = Contexts.size(); I != N; ++I) buildLookupImpl<&DeclContext::noload_decls_begin, - &DeclContext::noload_decls_end>(Contexts[I]); + &DeclContext::noload_decls_end>(Contexts[I], true); // We no longer have any lazy decls. LookupPtr.setInt(false); @@ -1555,7 +1555,7 @@ void DeclContext::makeDeclVisibleInContextImpl(NamedDecl *D, bool Internal) { return; } - else if (DeclNameEntries.isNull()) { + if (DeclNameEntries.isNull()) { DeclNameEntries.setOnlyValue(D); return; } diff --git a/test/Modules/Inputs/deferred-lookup/a.h b/test/Modules/Inputs/deferred-lookup/a.h new file mode 100644 index 0000000000..751aae0149 --- /dev/null +++ b/test/Modules/Inputs/deferred-lookup/a.h @@ -0,0 +1 @@ +namespace N { int f(int); } diff --git a/test/Modules/Inputs/deferred-lookup/b.h b/test/Modules/Inputs/deferred-lookup/b.h new file mode 100644 index 0000000000..23925e2e93 --- /dev/null +++ b/test/Modules/Inputs/deferred-lookup/b.h @@ -0,0 +1,6 @@ +namespace N { template struct A { friend int f(A); }; } +namespace N { int f(int); } +namespace N { int f(int); } +#include "a.h" +namespace N { int f(int); } +inline int g() { return f(N::A()); } diff --git a/test/Modules/Inputs/deferred-lookup/module.modulemap b/test/Modules/Inputs/deferred-lookup/module.modulemap new file mode 100644 index 0000000000..61578a1865 --- /dev/null +++ b/test/Modules/Inputs/deferred-lookup/module.modulemap @@ -0,0 +1,2 @@ +module a { header "a.h" export * } +module b { header "b.h" export * } diff --git a/test/Modules/deferred-lookup.cpp b/test/Modules/deferred-lookup.cpp new file mode 100644 index 0000000000..aaac389da0 --- /dev/null +++ b/test/Modules/deferred-lookup.cpp @@ -0,0 +1,6 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -I%S/Inputs/deferred-lookup -verify %s +// expected-no-diagnostics + +namespace N { int f(int); } +#include "b.h" -- 2.40.0