[clang] 5b769ff - [NFC] Add an invalid test case for C++20 Modules
Chuanqi Xu via cfe-commits
cfe-commits at lists.llvm.org
Sun Mar 5 22:41:22 PST 2023
Author: Chuanqi Xu
Date: 2023-03-06T14:39:32+08:00
New Revision: 5b769ff3e6a47eb2ffe8aa9e86f701ef046cf0a9
URL: https://github.com/llvm/llvm-project/commit/5b769ff3e6a47eb2ffe8aa9e86f701ef046cf0a9
DIFF: https://github.com/llvm/llvm-project/commit/5b769ff3e6a47eb2ffe8aa9e86f701ef046cf0a9.diff
LOG: [NFC] Add an invalid test case for C++20 Modules
Address https://github.com/llvm/llvm-project/issues/61150.
The test is intended to show the polluted operator&& will affect the ODR
checking and the ODR checking here is correct.
Added:
clang/test/Modules/polluted-operator.cppm
Modified:
Removed:
################################################################################
diff --git a/clang/test/Modules/polluted-operator.cppm b/clang/test/Modules/polluted-operator.cppm
new file mode 100644
index 0000000000000..b24464aa6ad21
--- /dev/null
+++ b/clang/test/Modules/polluted-operator.cppm
@@ -0,0 +1,57 @@
+// RUN: rm -rf %t
+// RUN: mkdir -p %t
+// RUN: split-file %s %t
+//
+// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/a.cppm -o %t/a.pcm
+// RUN: %clang_cc1 -std=c++20 %t/b.cppm -fprebuilt-module-path=%t -emit-module-interface -o %t/b.pcm -verify
+
+//--- foo.h
+
+namespace std
+{
+ template<class _Dom1>
+ void operator &&(_Dom1 __v, _Dom1 __w)
+ {
+ return;
+ }
+}
+
+//--- bar.h
+namespace std
+{
+ template<typename... _Types>
+ struct _Traits
+ {
+ static constexpr bool _S_copy_ctor =
+ (__is_trivial(_Types) && ...);
+ };
+
+ template<typename... _Types>
+ struct variant
+ {
+ void
+ swap(variant& __rhs)
+ noexcept((__is_trivial(_Types) && ...))
+ {
+ }
+ };
+}
+
+//--- a.cppm
+module;
+// The operator&& defined in 'foo.h' will pollute the
+// expression '__is_trivial(_Types) && ...' in bar.h
+#include "foo.h"
+#include "bar.h"
+export module a;
+
+//--- b.cppm
+module;
+#include "bar.h"
+export module b;
+import a;
+
+// expected-error@* {{has
diff erent definitions in
diff erent modules; first
diff erence is defined here found data member '_S_copy_ctor' with an initializer}}
+// expected-note@* {{but in 'a.<global>' found data member '_S_copy_ctor' with a
diff erent initializer}}
+// expected-error@* {{from module 'a.<global>' is not present in definition of 'variant<_Types...>' provided earlier}}
+// expected-note@* {{declaration of 'swap' does not match}}
More information about the cfe-commits
mailing list