[NFC] [C++20] [Modules] Add test for #pragma once
authorChuanqi Xu <yedeng.yd@linux.alibaba.com>
Mon, 20 Mar 2023 03:37:06 +0000 (11:37 +0800)
committerChuanqi Xu <yedeng.yd@linux.alibaba.com>
Mon, 20 Mar 2023 03:37:09 +0000 (11:37 +0800)
Close https://github.com/llvm/llvm-project/issues/38554
Close https://github.com/llvm/llvm-project/issues/58532

It looks like we can workaround the '#pragma once' problem automatically
after we force the lazily loading for named modules. Add a test to show
this.

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

diff --git a/clang/test/Modules/pr38554.cppm b/clang/test/Modules/pr38554.cppm
new file mode 100644 (file)
index 0000000..0193e5b
--- /dev/null
@@ -0,0 +1,21 @@
+// RUN: rm -rf %t
+// RUN: mkdir -p %t
+// RUN: split-file %s %t
+//
+// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %t/c.cppm
+
+//--- a.hpp
+#pragma once
+using a = int;
+
+//--- b.hpp
+#pragma once
+#include "a.hpp"
+a b;
+
+//--- c.cppm
+// expected-no-diagnostics
+module;
+#include "b.hpp"
+export module c;
+export using ::a;
diff --git a/clang/test/Modules/pr58532.cppm b/clang/test/Modules/pr58532.cppm
new file mode 100644 (file)
index 0000000..cf530b4
--- /dev/null
@@ -0,0 +1,34 @@
+// RUN: rm -rf %t
+// RUN: mkdir %t
+// RUN: split-file %s %t
+//
+// RUN: %clang_cc1 -std=c++20 %t/interface.cppm -emit-module-interface \
+// RUN:     -o %t/m.pcm
+// RUN: %clang_cc1 -std=c++20 %t/implementation.cpp -fmodule-file=m=%t/m.pcm \
+// RUN:     -fsyntax-only -verify
+
+//--- invisible.h
+#pragma once // This breaks things.
+const int kInvisibleSymbol = 0;
+struct invisible_struct
+{};
+#define INVISIBLE_DEFINE
+
+//--- visible.h
+#include "invisible.h"
+const int kSadlyUndeclaredSymbol = kInvisibleSymbol;
+using unfortunately_still_invisible_struct = invisible_struct;
+#ifndef INVISIBLE_DEFINE
+#    error "Still not defined."
+#endif
+
+//--- interface.cppm
+module;
+#include "visible.h"
+export module m;
+
+//--- implementation.cpp
+// expected-no-diagnostics
+module;
+#include "visible.h"
+module m;