summaryrefslogtreecommitdiffstats
path: root/clang/test/Modules/submodule-visibility.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2015-05-15 20:05:43 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2015-05-15 20:05:43 +0000
commit42413141641e26462a0d0c95f62b09fea5df78e9 (patch)
treedfcc51b854345c51e563fdbb5f28c1e7cb24310a /clang/test/Modules/submodule-visibility.cpp
parente70f8103781f1c4749b0de99aab050637bb5bd67 (diff)
downloadbcm5719-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/submodule-visibility.cpp')
-rw-r--r--clang/test/Modules/submodule-visibility.cpp21
1 files changed, 21 insertions, 0 deletions
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.
OpenPOWER on IntegriCloud