summaryrefslogtreecommitdiffstats
path: root/clang/test/Modules
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2016-10-13 23:04:14 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2016-10-13 23:04:14 +0000
commitb50df911788541fb5e17fe7cf3ce25330101a53a (patch)
tree5dfbd3ed0b7015b114563b7e54ae820b75cbfd36 /clang/test/Modules
parent7705c4f1be36d8c3384f71b71fdd6751a49d7a70 (diff)
downloadbcm5719-llvm-b50df911788541fb5e17fe7cf3ce25330101a53a.tar.gz
bcm5719-llvm-b50df911788541fb5e17fe7cf3ce25330101a53a.zip
Reinstate r281429, reverted in r281452, with a fix for its mishandling of
compiles without -fmodules-local-submodule-visibility. Original commit message: [modules] When merging one definition into another, propagate the list of re-exporting modules from the discarded definition to the retained definition. llvm-svn: 284176
Diffstat (limited to 'clang/test/Modules')
-rw-r--r--clang/test/Modules/Inputs/merge-template-pattern-visibility/a.h5
-rw-r--r--clang/test/Modules/Inputs/merge-template-pattern-visibility/b.h3
-rw-r--r--clang/test/Modules/Inputs/merge-template-pattern-visibility/c.h3
-rw-r--r--clang/test/Modules/Inputs/merge-template-pattern-visibility/d.h4
-rw-r--r--clang/test/Modules/Inputs/merge-var-template-def/a.h6
-rw-r--r--clang/test/Modules/Inputs/merge-var-template-def/b1.h7
-rw-r--r--clang/test/Modules/Inputs/merge-var-template-def/b2.h6
-rw-r--r--clang/test/Modules/Inputs/merge-var-template-def/module.modulemap5
-rw-r--r--clang/test/Modules/merge-template-pattern-visibility.cpp8
-rw-r--r--clang/test/Modules/merge-var-template-def.cpp7
10 files changed, 53 insertions, 1 deletions
diff --git a/clang/test/Modules/Inputs/merge-template-pattern-visibility/a.h b/clang/test/Modules/Inputs/merge-template-pattern-visibility/a.h
index e6592027611..b960ba6f573 100644
--- a/clang/test/Modules/Inputs/merge-template-pattern-visibility/a.h
+++ b/clang/test/Modules/Inputs/merge-template-pattern-visibility/a.h
@@ -4,3 +4,8 @@ template<typename T> struct B;
template<typename, typename> struct A {};
template<typename T> struct B : A<T> {};
template<typename T> inline auto C(T) {}
+
+namespace CrossModuleMerge {
+ template<typename T> inline auto D(T) {}
+ struct E {};
+}
diff --git a/clang/test/Modules/Inputs/merge-template-pattern-visibility/b.h b/clang/test/Modules/Inputs/merge-template-pattern-visibility/b.h
index 41b52d5e6ab..260b6b318ef 100644
--- a/clang/test/Modules/Inputs/merge-template-pattern-visibility/b.h
+++ b/clang/test/Modules/Inputs/merge-template-pattern-visibility/b.h
@@ -17,4 +17,7 @@ namespace CrossModuleMerge {
template<typename, typename> struct A {};
template<typename T> struct B : A<T> {};
template<typename T> inline auto C(T) {}
+
+ template<typename T> inline auto D(T) {}
+ struct E;
}
diff --git a/clang/test/Modules/Inputs/merge-template-pattern-visibility/c.h b/clang/test/Modules/Inputs/merge-template-pattern-visibility/c.h
index db80eda1ea6..01594bb4b89 100644
--- a/clang/test/Modules/Inputs/merge-template-pattern-visibility/c.h
+++ b/clang/test/Modules/Inputs/merge-template-pattern-visibility/c.h
@@ -5,5 +5,8 @@ namespace CrossModuleMerge {
template<typename, typename> struct A {};
template<typename T> struct B : A<T> {};
template<typename T> inline auto C(T) {}
+
+ template<typename T> inline auto D(T) {}
+ struct E {};
}
diff --git a/clang/test/Modules/Inputs/merge-template-pattern-visibility/d.h b/clang/test/Modules/Inputs/merge-template-pattern-visibility/d.h
index 464f0f5bbed..7bbd01ebce4 100644
--- a/clang/test/Modules/Inputs/merge-template-pattern-visibility/d.h
+++ b/clang/test/Modules/Inputs/merge-template-pattern-visibility/d.h
@@ -1 +1,3 @@
-// d.h: empty
+namespace CrossModuleMerge {
+ struct E {};
+}
diff --git a/clang/test/Modules/Inputs/merge-var-template-def/a.h b/clang/test/Modules/Inputs/merge-var-template-def/a.h
new file mode 100644
index 00000000000..cce887530d7
--- /dev/null
+++ b/clang/test/Modules/Inputs/merge-var-template-def/a.h
@@ -0,0 +1,6 @@
+#ifndef A_H
+#define A_H
+template<typename T> struct A { static bool b; };
+template<typename T> bool A<T>::b = false;
+template<typename T> void *get() { return &(A<T>::b); }
+#endif
diff --git a/clang/test/Modules/Inputs/merge-var-template-def/b1.h b/clang/test/Modules/Inputs/merge-var-template-def/b1.h
new file mode 100644
index 00000000000..1ef89746f72
--- /dev/null
+++ b/clang/test/Modules/Inputs/merge-var-template-def/b1.h
@@ -0,0 +1,7 @@
+#ifndef B1_H
+#define B1_H
+template<typename T> struct A { static bool b; };
+template<typename T> bool A<T>::b = false;
+template<typename T> void *get() { return &(A<T>::b); }
+#include "a.h"
+#endif
diff --git a/clang/test/Modules/Inputs/merge-var-template-def/b2.h b/clang/test/Modules/Inputs/merge-var-template-def/b2.h
new file mode 100644
index 00000000000..3c7e5303e65
--- /dev/null
+++ b/clang/test/Modules/Inputs/merge-var-template-def/b2.h
@@ -0,0 +1,6 @@
+#ifndef B2_H
+#define B2_H
+template<typename T> struct A { static bool b; };
+template<typename T> bool A<T>::b = false;
+template<typename T> void *get() { return &(A<T>::b); }
+#endif
diff --git a/clang/test/Modules/Inputs/merge-var-template-def/module.modulemap b/clang/test/Modules/Inputs/merge-var-template-def/module.modulemap
new file mode 100644
index 00000000000..b2c96bd8217
--- /dev/null
+++ b/clang/test/Modules/Inputs/merge-var-template-def/module.modulemap
@@ -0,0 +1,5 @@
+module a { header "a.h" export * }
+module b {
+ module b1 { header "b1.h" export * }
+ module b2 { header "b2.h" export * }
+}
diff --git a/clang/test/Modules/merge-template-pattern-visibility.cpp b/clang/test/Modules/merge-template-pattern-visibility.cpp
index ec5aa26c68d..bb34d3b2a60 100644
--- a/clang/test/Modules/merge-template-pattern-visibility.cpp
+++ b/clang/test/Modules/merge-template-pattern-visibility.cpp
@@ -7,6 +7,12 @@
// RUN: -fmodules-local-submodule-visibility -o %t/Y.pcm
// RUN: %clang_cc1 -fmodules -fno-modules-error-recovery -std=c++14 -fmodule-file=%t/X.pcm -fmodule-file=%t/Y.pcm \
// RUN: -fmodules-local-submodule-visibility -verify %s -I%S/Inputs/merge-template-pattern-visibility
+// RUN: %clang_cc1 -fmodules -fno-modules-error-recovery -std=c++14 -fmodule-file=%t/Y.pcm -fmodule-file=%t/X.pcm \
+// RUN: -fmodules-local-submodule-visibility -verify %s -I%S/Inputs/merge-template-pattern-visibility
+// RUN: %clang_cc1 -fmodules -fno-modules-error-recovery -std=c++14 -fmodule-file=%t/X.pcm -fmodule-file=%t/Y.pcm \
+// RUN: -verify %s -I%S/Inputs/merge-template-pattern-visibility
+// RUN: %clang_cc1 -fmodules -fno-modules-error-recovery -std=c++14 -fmodule-file=%t/Y.pcm -fmodule-file=%t/X.pcm \
+// RUN: -verify %s -I%S/Inputs/merge-template-pattern-visibility
#include "b.h"
#include "d.h"
@@ -15,4 +21,6 @@
void g() {
CrossModuleMerge::B<int> bi;
CrossModuleMerge::C(0);
+ CrossModuleMerge::D(0);
+ CrossModuleMerge::E e;
}
diff --git a/clang/test/Modules/merge-var-template-def.cpp b/clang/test/Modules/merge-var-template-def.cpp
new file mode 100644
index 00000000000..4d39cad3103
--- /dev/null
+++ b/clang/test/Modules/merge-var-template-def.cpp
@@ -0,0 +1,7 @@
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -I%S/Inputs/merge-var-template-def -verify -fmodules -Werror=undefined-internal -fmodules-local-submodule-visibility -fmodules-cache-path=%t -fimplicit-module-maps %s
+// expected-no-diagnostics
+
+#include "b2.h"
+namespace { struct X; }
+void *x = get<X>();
OpenPOWER on IntegriCloud