https://github.com/yronglin updated https://github.com/llvm/llvm-project/pull/144214
>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 1/2] [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> >From e29aaaf786292016237fe071387ae17953995528 Mon Sep 17 00:00:00 2001 From: yronglin <yronglin...@gmail.com> Date: Sat, 14 Jun 2025 16:57:35 +0800 Subject: [PATCH 2/2] Update none -> full in cxx_status.html Signed-off-by: yronglin <yronglin...@gmail.com> --- clang/www/cxx_status.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/www/cxx_status.html b/clang/www/cxx_status.html index cd39ea830b57a..c23ab80761e4c 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">Clang 17</td> + <td class="full" 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