diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-05-15 20:05:43 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-05-15 20:05:43 +0000 |
commit | 42413141641e26462a0d0c95f62b09fea5df78e9 (patch) | |
tree | dfcc51b854345c51e563fdbb5f28c1e7cb24310a /clang/test/Modules | |
parent | e70f8103781f1c4749b0de99aab050637bb5bd67 (diff) | |
download | bcm5719-llvm-42413141641e26462a0d0c95f62b09fea5df78e9.tar.gz bcm5719-llvm-42413141641e26462a0d0c95f62b09fea5df78e9.zip |
[modules] Add local submodule visibility support for declarations.
With this change, enabling -fmodules-local-submodule-visibility results in name
visibility rules being applied to submodules of the current module in addition
to imported modules (that is, names no longer "leak" between submodules of the
same top-level module). This also makes it much safer to textually include a
non-modular library into a module: each submodule that textually includes that
library will get its own "copy" of that library, and so the library becomes
visible no matter which including submodule you import.
llvm-svn: 237473
Diffstat (limited to 'clang/test/Modules')
-rw-r--r-- | clang/test/Modules/Inputs/submodule-visibility/a.h | 1 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/submodule-visibility/b.h | 1 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/submodule-visibility/module.modulemap | 1 | ||||
-rw-r--r-- | clang/test/Modules/macros.c | 2 | ||||
-rw-r--r-- | clang/test/Modules/macros2.c | 2 | ||||
-rw-r--r-- | clang/test/Modules/submodule-visibility.cpp | 21 | ||||
-rw-r--r-- | clang/test/Modules/submodules-merge-defs.cpp | 2 |
7 files changed, 28 insertions, 2 deletions
diff --git a/clang/test/Modules/Inputs/submodule-visibility/a.h b/clang/test/Modules/Inputs/submodule-visibility/a.h new file mode 100644 index 00000000000..d8805c92f24 --- /dev/null +++ b/clang/test/Modules/Inputs/submodule-visibility/a.h @@ -0,0 +1 @@ +int n; diff --git a/clang/test/Modules/Inputs/submodule-visibility/b.h b/clang/test/Modules/Inputs/submodule-visibility/b.h new file mode 100644 index 00000000000..fa419c0c5c4 --- /dev/null +++ b/clang/test/Modules/Inputs/submodule-visibility/b.h @@ -0,0 +1 @@ +int m = n; diff --git a/clang/test/Modules/Inputs/submodule-visibility/module.modulemap b/clang/test/Modules/Inputs/submodule-visibility/module.modulemap new file mode 100644 index 00000000000..447a1f42d45 --- /dev/null +++ b/clang/test/Modules/Inputs/submodule-visibility/module.modulemap @@ -0,0 +1 @@ +module x { module a { header "a.h" } module b { header "b.h" } } diff --git a/clang/test/Modules/macros.c b/clang/test/Modules/macros.c index 7b7b52aa017..538d4a8d6a7 100644 --- a/clang/test/Modules/macros.c +++ b/clang/test/Modules/macros.c @@ -1,7 +1,7 @@ // RUN: rm -rf %t // RUN: %clang_cc1 -fmodules -x objective-c -verify -fmodules-cache-path=%t -I %S/Inputs %s // RUN: %clang_cc1 -fmodules -x objective-c -verify -fmodules-cache-path=%t -I %S/Inputs %s -detailed-preprocessing-record -// RUN: %clang_cc1 -fmodules -DLOCAL_VISIBILITY -fmodules-local-submodule-visibility -x objective-c -verify -fmodules-cache-path=%t -I %S/Inputs %s +// RUN: %clang_cc1 -fmodules -DLOCAL_VISIBILITY -fmodules-local-submodule-visibility -x objective-c++ -verify -fmodules-cache-path=%t -I %S/Inputs %s // RUN: not %clang_cc1 -E -fmodules -x objective-c -fmodules-cache-path=%t -I %S/Inputs %s | FileCheck -check-prefix CHECK-PREPROCESSED %s // FIXME: When we have a syntax for modules in C, use that. // These notes come from headers in modules, and are bogus. diff --git a/clang/test/Modules/macros2.c b/clang/test/Modules/macros2.c index addb9b495cf..0bb801ee995 100644 --- a/clang/test/Modules/macros2.c +++ b/clang/test/Modules/macros2.c @@ -1,6 +1,6 @@ // RUN: rm -rf %t // RUN: %clang_cc1 -fmodules -x objective-c -verify -fmodules-cache-path=%t -I %S/Inputs %s -// RUN: %clang_cc1 -fmodules -fmodules-local-submodule-visibility -x objective-c -verify -fmodules-cache-path=%t -I %S/Inputs %s -DLOCAL_VISIBILITY +// RUN: %clang_cc1 -fmodules -fmodules-local-submodule-visibility -x objective-c++ -verify -fmodules-cache-path=%t -I %S/Inputs %s -DLOCAL_VISIBILITY // This test checks some of the same things as macros.c, but imports modules in // a different order. diff --git a/clang/test/Modules/submodule-visibility.cpp b/clang/test/Modules/submodule-visibility.cpp new file mode 100644 index 00000000000..c63d942cc9e --- /dev/null +++ b/clang/test/Modules/submodule-visibility.cpp @@ -0,0 +1,21 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -I%S/Inputs/submodule-visibility -verify %s -DALLOW_NAME_LEAKAGE +// RUN: %clang_cc1 -fmodules -fmodules-local-submodule-visibility -fmodules-cache-path=%t -I%S/Inputs/submodule-visibility -verify %s -DIMPORT +// RUN: %clang_cc1 -fmodules -fmodules-local-submodule-visibility -fmodules-cache-path=%t -fmodule-name=x -I%S/Inputs/submodule-visibility -verify %s + +#include "a.h" +#include "b.h" + +#if ALLOW_NAME_LEAKAGE +// expected-no-diagnostics +#elif IMPORT +// expected-error@-6 {{could not build module 'x'}} +#else +// The use of -fmodule-name=x causes us to textually include the above headers. +// The submodule visibility rules are still applied in this case. +// +// expected-error@b.h:1 {{declaration of 'n' must be imported from module 'x.a'}} +// expected-note@a.h:1 {{here}} +#endif + +int k = n + m; // OK, a and b are visible here. diff --git a/clang/test/Modules/submodules-merge-defs.cpp b/clang/test/Modules/submodules-merge-defs.cpp index 79213cae8fa..0e2f5d9e546 100644 --- a/clang/test/Modules/submodules-merge-defs.cpp +++ b/clang/test/Modules/submodules-merge-defs.cpp @@ -1,6 +1,8 @@ // RUN: rm -rf %t // 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 -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 +// 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 // Trigger import of definitions, but don't make them visible. #include "empty.h" |