[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