summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2015-06-11 03:05:39 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2015-06-11 03:05:39 +0000
commit00be6d0ff86a5328c13f3f88171b26097c8ed664 (patch)
treed302511800ab41e53edcaf85dbbba82b492e00d0 /clang
parent9321f926b01bfba21fa2524d916b889f280bae8e (diff)
downloadbcm5719-llvm-00be6d0ff86a5328c13f3f88171b26097c8ed664.tar.gz
bcm5719-llvm-00be6d0ff86a5328c13f3f88171b26097c8ed664.zip
[modules] Fix a few places where merging wasn't performed if modules was disabled but local module visibilty was enabled.
llvm-svn: 239504
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/SemaDecl.cpp7
-rw-r--r--clang/lib/Sema/SemaType.cpp2
-rw-r--r--clang/test/Modules/Inputs/submodules-merge-defs/defs.h8
-rw-r--r--clang/test/Modules/Inputs/submodules-merge-defs/indirect.h1
-rw-r--r--clang/test/Modules/Inputs/submodules-merge-defs/module.modulemap5
-rw-r--r--clang/test/Modules/submodules-merge-defs.cpp11
6 files changed, 30 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 1c0eea72dd8..a4a73753383 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 628eb734cdd..5734f3b2ed5 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 68b57a4a62f..d65e93bf72b 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<typename T = int, int N = 3, template<typename> class K = F> int H(int a = 1);
template<typename T = int, int N = 3, template<typename> class K = F> using I = decltype(H<T, N, K>());
+
+namespace NS {
+ struct A {};
+ template<typename T> struct B {};
+ template<typename T> struct B<T*> {};
+ template<> struct B<int> {};
+ 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 00000000000..28baa019b22
--- /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 82abdb088f1..f8ae60fe44f 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 0e2f5d9e546..6884f56ce7d 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<char>().f();
int post_fg = F<char>().g<int>();
+#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
OpenPOWER on IntegriCloud