[NFC] [Modules] Add test from PR60036
authorChuanqi Xu <yedeng.yd@linux.alibaba.com>
Mon, 16 Jan 2023 07:08:14 +0000 (15:08 +0800)
committerChuanqi Xu <yedeng.yd@linux.alibaba.com>
Mon, 16 Jan 2023 07:08:16 +0000 (15:08 +0800)
Although I failed to reproduce the problem in pr60036, it should be
always good to have more tests.

clang/test/Modules/pr60036.cppm [new file with mode: 0644]

diff --git a/clang/test/Modules/pr60036.cppm b/clang/test/Modules/pr60036.cppm
new file mode 100644 (file)
index 0000000..187a68f
--- /dev/null
@@ -0,0 +1,103 @@
+// Test case from https://github.com/llvm/llvm-project/issues/60036
+//
+// RUN: rm -rf %t
+// RUN: mkdir -p %t
+// RUN: split-file %s %t
+//
+// RUN: %clang_cc1 -std=c++20 %t/a.cppm -emit-module-interface -o %t/a.pcm
+// RUN: %clang_cc1 -std=c++20 %t/b.cppm -emit-module-interface -fprebuilt-module-path=%t -o %t/b.pcm
+// RUN: %clang_cc1 -std=c++20 %t/c.cppm -emit-module-interface -fprebuilt-module-path=%t -o %t/c.pcm
+// RUN: %clang_cc1 -std=c++20 %t/d.cppm -emit-module-interface -fprebuilt-module-path=%t -o %t/d.pcm
+// RUN: %clang_cc1 -std=c++20 %t/e.cppm -emit-module-interface -fprebuilt-module-path=%t -o %t/e.pcm
+// RUN: %clang_cc1 -std=c++20 %t/f.cppm -emit-module-interface -fprebuilt-module-path=%t -o %t/f.pcm
+// RUN: %clang_cc1 -std=c++20 %t/g.cppm -fprebuilt-module-path=%t -verify -fsyntax-only 
+//
+// Tests that the behavior is fine with specifying module file with `-fmodule-file`.
+// RUN: %clang_cc1 -std=c++20 %t/a.cppm -emit-module-interface -o %t/a.pcm
+// RUN: %clang_cc1 -std=c++20 %t/b.cppm -emit-module-interface -fmodule-file=%t/a.pcm -o %t/b.pcm
+// RUN: %clang_cc1 -std=c++20 %t/c.cppm -emit-module-interface -fmodule-file=%t/a.pcm -o %t/c.pcm
+// RUN: %clang_cc1 -std=c++20 %t/d.cppm -emit-module-interface  -o %t/d.pcm
+// RUN: %clang_cc1 -std=c++20 %t/e.cppm -emit-module-interface -fmodule-file=%t/d.pcm -o %t/e.pcm
+// RUN: %clang_cc1 -std=c++20 %t/f.cppm -emit-module-interface -fmodule-file=%t/a.pcm -fmodule-file=%t/b.pcm -fmodule-file=%t/c.pcm -fmodule-file=%t/d.pcm -o %t/f.pcm
+// RUN: %clang_cc1 -std=c++20 %t/g.cppm -fmodule-file=%t/e.pcm -fmodule-file=%t/f.pcm -verify -fsyntax-only 
+
+//--- a.cppm
+export module a;
+
+export template<typename>
+struct a;
+
+template<typename T>
+struct a<T &> {
+       using type = char;
+};
+
+//--- b.cppm
+export module b;
+
+import a;
+
+typename a<char &>::type;
+
+//--- c.cppm
+export module c;
+
+import a;
+
+typename a<char &>::type;
+
+//--- d.cppm
+export module d;
+
+export template<typename>
+struct d {
+       d() {}
+       explicit d(int) requires(true) {}
+       d(auto &&) {}
+};
+
+//--- e.cppm
+export module e;
+
+import d;
+
+auto r = d<int>();
+
+//--- f.cppm
+export module f;
+
+import a;
+import b;
+import c;
+import d;
+
+template<typename T>
+struct array {
+       friend void fr(array<T> const &) {
+       }
+};
+
+array() -> array<typename a<char &>::type>;
+
+struct wrap {
+       d<int> m;
+};
+
+template<typename T>
+int f1(T) {
+       return 1;
+}
+
+void f2() {
+       d<int> view;
+       int x = f1(view);
+       typename a<decltype([x]{}) &>::type;
+       wrap w;
+}
+
+//--- g.cppm
+// expected-no-diagnostics
+export module g;
+
+import e;
+import f;