From 00be6d0ff86a5328c13f3f88171b26097c8ed664 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Thu, 11 Jun 2015 03:05:39 +0000 Subject: [PATCH] [modules] Fix a few places where merging wasn't performed if modules was disabled but local module visibilty was enabled. llvm-svn: 239504 --- clang/lib/Sema/SemaDecl.cpp | 7 ++++--- clang/lib/Sema/SemaType.cpp | 2 +- clang/test/Modules/Inputs/submodules-merge-defs/defs.h | 8 ++++++++ clang/test/Modules/Inputs/submodules-merge-defs/indirect.h | 1 + .../Modules/Inputs/submodules-merge-defs/module.modulemap | 5 +++++ clang/test/Modules/submodules-merge-defs.cpp | 11 +++++++++++ 6 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 clang/test/Modules/Inputs/submodules-merge-defs/indirect.h diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 1c0eea7..a4a7375 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -1788,7 +1788,7 @@ static void filterNonConflictingPreviousDecls(Sema &S, NamedDecl *decl, LookupResult &previous){ // This is only interesting when modules are enabled. - if (!S.getLangOpts().Modules) + if (!S.getLangOpts().Modules && !S.getLangOpts().ModulesLocalVisibility) return; // Empty sets are uninteresting. @@ -1818,7 +1818,7 @@ static void filterNonConflictingPreviousTypedefDecls(Sema &S, TypedefNameDecl *Decl, LookupResult &Previous) { // This is only interesting when modules are enabled. - if (!S.getLangOpts().Modules) + if (!S.getLangOpts().Modules && !S.getLangOpts().ModulesLocalVisibility) return; // Empty sets are uninteresting. @@ -13488,7 +13488,8 @@ EnumConstantDecl *Sema::CheckEnumConstant(EnumDecl *Enum, Sema::SkipBodyInfo Sema::shouldSkipAnonEnumBody(Scope *S, IdentifierInfo *II, SourceLocation IILoc) { - if (!getLangOpts().Modules || !getLangOpts().CPlusPlus) + if (!(getLangOpts().Modules || getLangOpts().ModulesLocalVisibility) || + !getLangOpts().CPlusPlus) return SkipBodyInfo(); // We have an anonymous enum definition. Look up the first enumerator to diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 628eb73..5734f3b 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -5153,7 +5153,7 @@ bool Sema::RequireCompleteType(SourceLocation Loc, QualType T, /// in order to provide a definition of this entity. bool Sema::hasVisibleDefinition(NamedDecl *D, NamedDecl **Suggested) { // Easy case: if we don't have modules, all declarations are visible. - if (!getLangOpts().Modules) + if (!getLangOpts().Modules && !getLangOpts().ModulesLocalVisibility) return true; // If this definition was instantiated from a template, map back to the diff --git a/clang/test/Modules/Inputs/submodules-merge-defs/defs.h b/clang/test/Modules/Inputs/submodules-merge-defs/defs.h index 68b57a4..d65e93b 100644 --- a/clang/test/Modules/Inputs/submodules-merge-defs/defs.h +++ b/clang/test/Modules/Inputs/submodules-merge-defs/defs.h @@ -46,3 +46,11 @@ namespace G { template class K = F> int H(int a = 1); template class K = F> using I = decltype(H()); + +namespace NS { + struct A {}; + template struct B {}; + template struct B {}; + template<> struct B {}; + inline void f() {} +} diff --git a/clang/test/Modules/Inputs/submodules-merge-defs/indirect.h b/clang/test/Modules/Inputs/submodules-merge-defs/indirect.h new file mode 100644 index 0000000..28baa01 --- /dev/null +++ b/clang/test/Modules/Inputs/submodules-merge-defs/indirect.h @@ -0,0 +1 @@ +#include "merged-defs.h" diff --git a/clang/test/Modules/Inputs/submodules-merge-defs/module.modulemap b/clang/test/Modules/Inputs/submodules-merge-defs/module.modulemap index 82abdb0..f8ae60f 100644 --- a/clang/test/Modules/Inputs/submodules-merge-defs/module.modulemap +++ b/clang/test/Modules/Inputs/submodules-merge-defs/module.modulemap @@ -14,3 +14,8 @@ module "merged-defs" { header "merged-defs.h" use "stuff" } + +module "indirect" { + header "indirect.h" + use "merged-defs" +} diff --git a/clang/test/Modules/submodules-merge-defs.cpp b/clang/test/Modules/submodules-merge-defs.cpp index 0e2f5d9e..6884f56 100644 --- a/clang/test/Modules/submodules-merge-defs.cpp +++ b/clang/test/Modules/submodules-merge-defs.cpp @@ -3,9 +3,13 @@ // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules-cache-path=%t -fmodules -I %S/Inputs/submodules-merge-defs %s -verify -fno-modules-error-recovery // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules-cache-path=%t -fmodules -I %S/Inputs/submodules-merge-defs %s -verify -fno-modules-error-recovery -fmodules-local-submodule-visibility -DTEXTUAL // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules-cache-path=%t -fmodules -I %S/Inputs/submodules-merge-defs %s -verify -fno-modules-error-recovery -fmodules-local-submodule-visibility +// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules-cache-path=%t -fmodule-maps -I %S/Inputs/submodules-merge-defs %s -verify -fno-modules-error-recovery -fmodules-local-submodule-visibility -DTEXTUAL -DEARLY_INDIRECT_INCLUDE // Trigger import of definitions, but don't make them visible. #include "empty.h" +#ifdef EARLY_INDIRECT_INCLUDE +#include "indirect.h" +#endif A pre_a; // expected-error {{must be imported}} expected-error {{must use 'struct'}} // expected-note@defs.h:1 +{{here}} @@ -54,3 +58,10 @@ int post_use_dx = use_dx(post_dx); int post_e = E(0); int post_ff = F().f(); int post_fg = F().g(); +#ifdef EARLY_INDIRECT_INCLUDE +// FIXME: Properly track the owning module for a member specialization. +// expected-error@defs.h:34 {{redefinition}} +// expected-note@defs.h:34 {{previous definition}} +// expected-error@-5 {{no matching member function}} +// expected-note@defs.h:34 {{substitution failure}} +#endif -- 2.7.4