aboutsummaryrefslogtreecommitdiff
path: root/test/Modules/odr_hash.cl
diff options
context:
space:
mode:
Diffstat (limited to 'test/Modules/odr_hash.cl')
-rw-r--r--test/Modules/odr_hash.cl80
1 files changed, 80 insertions, 0 deletions
diff --git a/test/Modules/odr_hash.cl b/test/Modules/odr_hash.cl
new file mode 100644
index 000000000000..d4af1cea6e26
--- /dev/null
+++ b/test/Modules/odr_hash.cl
@@ -0,0 +1,80 @@
+// Clear and create directories
+// RUN: rm -rf %t
+// RUN: mkdir %t
+// RUN: mkdir %t/cache
+// RUN: mkdir %t/Inputs
+
+// Build first header file
+// RUN: echo "#define FIRST" >> %t/Inputs/first.h
+// RUN: cat %s >> %t/Inputs/first.h
+
+// Build second header file
+// RUN: echo "#define SECOND" >> %t/Inputs/second.h
+// RUN: cat %s >> %t/Inputs/second.h
+
+// Test that each header can compile
+// RUN: %clang_cc1 -fsyntax-only -x c++ %t/Inputs/first.h -cl-std=CL2.0
+// RUN: %clang_cc1 -fsyntax-only -x c++ %t/Inputs/second.h -cl-std=CL2.0
+
+// Build module map file
+// RUN: echo "module FirstModule {" >> %t/Inputs/module.map
+// RUN: echo " header \"first.h\"" >> %t/Inputs/module.map
+// RUN: echo "}" >> %t/Inputs/module.map
+// RUN: echo "module SecondModule {" >> %t/Inputs/module.map
+// RUN: echo " header \"second.h\"" >> %t/Inputs/module.map
+// RUN: echo "}" >> %t/Inputs/module.map
+
+// Run test
+// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/cache -x c++ -I%t/Inputs -verify %s -cl-std=CL2.0
+
+#if !defined(FIRST) && !defined(SECOND)
+#include "first.h"
+#include "second.h"
+#endif
+
+
+#if defined(FIRST)
+void invalid1() {
+ typedef read_only pipe int x;
+}
+void invalid2() {
+ typedef read_only pipe int x;
+}
+void valid() {
+ typedef read_only pipe int x;
+ typedef write_only pipe int y;
+ typedef read_write pipe int z;
+}
+#elif defined(SECOND)
+void invalid1() {
+ typedef write_only pipe int x;
+}
+void invalid2() {
+ typedef read_only pipe float x;
+}
+void valid() {
+ typedef read_only pipe int x;
+ typedef write_only pipe int y;
+ typedef read_write pipe int z;
+}
+#else
+void run() {
+ invalid1();
+// expected-error@second.h:* {{'invalid1' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}}
+// expected-note@first.h:* {{but in 'FirstModule' found a different body}}
+ invalid2();
+// expected-error@second.h:* {{'invalid2' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}}
+// expected-note@first.h:* {{but in 'FirstModule' found a different body}}
+ valid();
+}
+#endif
+
+
+// Keep macros contained to one file.
+#ifdef FIRST
+#undef FIRST
+#endif
+
+#ifdef SECOND
+#undef SECOND
+#endif