https://github.com/yronglin created 
https://github.com/llvm/llvm-project/pull/144214

This PR mark [P2788R0(DR)](https://wg21.link/P2788R0) as implemented and added 
more test.

P2788R0 implemented by 62a16d5e2069542351c164aa0e3b216dc8e153c4.

>From dc1fcdd5d9ea72f294fe5d1ae6a196cb2751ff9c Mon Sep 17 00:00:00 2001
From: yronglin <yronglin...@gmail.com>
Date: Sat, 14 Jun 2025 16:02:00 +0800
Subject: [PATCH] [C++][Modules] Mark P2788R0(DR) as implemented and added more
 test

Signed-off-by: yronglin <yronglin...@gmail.com>
---
 clang/test/CXX/basic/basic.link/p3.cpp | 105 +++++++++++++++++++------
 clang/www/cxx_status.html              |   2 +-
 2 files changed, 81 insertions(+), 26 deletions(-)

diff --git a/clang/test/CXX/basic/basic.link/p3.cpp 
b/clang/test/CXX/basic/basic.link/p3.cpp
index 01202264d2591..22c298394c2a6 100644
--- a/clang/test/CXX/basic/basic.link/p3.cpp
+++ b/clang/test/CXX/basic/basic.link/p3.cpp
@@ -1,35 +1,23 @@
-// RUN: %clang_cc1 -std=c++2a -verify %s
-// RUN: %clang_cc1 -std=c++2a -verify %s -DIMPORT_ERROR=1
-// RUN: %clang_cc1 -std=c++2a -verify %s -DIMPORT_ERROR=2
+// RUN: rm -rf %t
+// RUN: split-file %s %t
 
+// RUN: %clang_cc1 -std=c++20 -verify %t/M.cppm
+// RUN: %clang_cc1 -std=c++20 -verify %t/ImportError1.cppm
+// RUN: %clang_cc1 -std=c++20 -verify %t/ImportError2.cppm
+// RUN: %clang_cc1 -std=c++20 -Wno-reserved-module-identifier 
-emit-module-interface %t/std.cppm -o %t/std.pcm
+// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/A.cppm -o %t/A.pcm
+// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/A-B.cppm -o %t/A-B.pcm
+// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify 
-fmodule-file=std=%t/std.pcm -fmodule-file=A=%t/A.pcm 
-fmodule-file=A:B=%t/A-B.pcm %t/A_impl.cppm
+// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify -fmodule-file=A=%t/A.pcm 
%t/User.cppm 
+
+//--- M.cppm
 module;
 
-#if IMPORT_ERROR != 2
 struct import { struct inner {}; };
-#endif
 struct module { struct inner {}; };
-
 constexpr int n = 123;
 
 export module m; // #1
-
-// Import errors are fatal, so we test them in isolation.
-#if IMPORT_ERROR == 1
-import x = {}; // expected-error {{expected ';' after module name}}
-               // expected-error@-1 {{module 'x' not found}}
-
-#elif IMPORT_ERROR == 2
-struct X;
-template<int> struct import;
-template<> struct import<n> {
-  static X y;
-};
-
-// This is not valid because the 'import <n>' is a pp-import, even though it
-// grammatically can't possibly be an import declaration.
-struct X {} import<n>::y; // expected-error {{'n' file not found}}
-
-#else
 module y = {}; // expected-error {{multiple module declarations}} 
expected-error 2{{}}
 // expected-note@#1 {{previous module declaration}}
 
@@ -51,4 +39,71 @@ template<typename T> module module_var_template;
 
 // This is a variable named 'import' that shadows the type 'import' above.
 struct X {} import;
-#endif
+
+//--- ImportError1.cppm
+module;
+
+struct import { struct inner {}; };
+struct module { struct inner {}; };
+
+constexpr int n = 123;
+
+export module m; // #1
+
+import x = {}; // expected-error {{expected ';' after module name}}
+               // expected-error@-1 {{module 'x' not found}}
+
+//--- ImportError2.cppm
+module;
+
+struct module { struct inner {}; };
+
+constexpr int n = 123;
+
+export module m; // #1
+
+struct X;
+template<int> struct import;
+template<> struct import<n> {
+  static X y;
+};
+
+// This is not valid because the 'import <n>' is a pp-import, even though it
+// grammatically can't possibly be an import declaration.
+struct X {} import<n>::y; // expected-error {{'n' file not found}}
+
+//--- A.cppm
+export module A;
+const double delta=0.01;
+export {
+  template<class F>
+  double derivative(F &&f,double x) {
+    return (f(x+delta)-f(x))/delta;
+  }
+}
+
+//--- std.cppm
+export module std;
+export using size_t = decltype(sizeof(void *));
+
+export namespace std {
+  template <typename T, size_t N>
+  struct array {};
+}
+
+//--- A-B.cppm
+module A:B;
+const int dimensions=3;
+
+//--- A_impl.cppm
+// expected-no-diagnostics
+module A;
+import std;
+import :B;
+
+using vector = std::array<double, dimensions>;  // error: lookup failed until 
P2788R0(Linkage for modular constants).
+
+//--- User.cppm
+// expected-no-diagnostics
+import A;
+double d=derivative([](double x) {return x*x;},2);  // error: names delta 
until P2788R0(Linkage for modular constants).
diff --git a/clang/www/cxx_status.html b/clang/www/cxx_status.html
index dff57689e84b9..cd39ea830b57a 100755
--- a/clang/www/cxx_status.html
+++ b/clang/www/cxx_status.html
@@ -905,7 +905,7 @@ <h2 id="cxx20">C++20 implementation status</h2>
       </tr>
       <tr> <!-- from Issaquah 2023 -->
         <td><a href="https://wg21.link/P2788R0";>P2788R0</a> (<a 
href="#dr">DR</a>)</td>
-        <td class="none" align="center">No</td>
+        <td class="none" align="center">Clang 17</td>
       </tr>
     <tr>
       <td>Coroutines</td>

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to