https://github.com/yronglin created https://github.com/llvm/llvm-project/pull/90574
This PR implement [P3034R1 Module Declarations Shouldn’t be Macros](https://wg21.link/P3034R1) >From 1dcb4c3ac1efaf3a6a4317751e23089a6c8ccac1 Mon Sep 17 00:00:00 2001 From: yronglin <yronglin...@gmail.com> Date: Tue, 30 Apr 2024 17:18:26 +0800 Subject: [PATCH] =?UTF-8?q?[Clang]=20Implement=20P3034R1=20Module=20Declar?= =?UTF-8?q?ations=20Shouldn=E2=80=99t=20be=20Macros?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yronglin <yronglin...@gmail.com> --- clang/docs/ReleaseNotes.rst | 2 ++ .../clang/Basic/DiagnosticParseKinds.td | 2 ++ clang/lib/Parse/Parser.cpp | 7 ++++ clang/test/CXX/cpp/cpp.module/p1.cppm | 13 +++++++ clang/test/CXX/cpp/cpp.module/version.h | 8 +++++ .../basic/basic.link/module-declaration.cpp | 35 +++++++++++-------- .../dcl.module/dcl.module.import/p1.cppm | 4 +-- clang/test/SemaCXX/modules.cppm | 4 +++ clang/www/cxx_status.html | 2 +- 9 files changed, 59 insertions(+), 18 deletions(-) create mode 100644 clang/test/CXX/cpp/cpp.module/p1.cppm create mode 100644 clang/test/CXX/cpp/cpp.module/version.h diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 1abc00a25f1f42..40c6bd63e9948f 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -153,6 +153,8 @@ C++2c Feature Support - Implemented `P2748R5 Disallow Binding a Returned Glvalue to a Temporary <https://wg21.link/P2748R5>`_. +- Implemented `P3034R1 Module Declarations Shouldn’t be Macros <https://wg21.link/P3034R1>`_. + Resolutions to C++ Defect Reports ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - Substitute template parameter pack, when it is not explicitly specified diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td index fdffb35ea0d955..0d4b526ec6d15a 100644 --- a/clang/include/clang/Basic/DiagnosticParseKinds.td +++ b/clang/include/clang/Basic/DiagnosticParseKinds.td @@ -1671,6 +1671,8 @@ def err_unexpected_module_decl : Error< "module declaration can only appear at the top level">; def err_module_expected_ident : Error< "expected a module name after '%select{module|import}0'">; +def err_module_decl_cannot_be_macros : Error< + "module declaration cannot be a macro">; def err_attribute_not_module_attr : Error< "%0 attribute cannot be applied to a module">; def err_keyword_not_module_attr : Error< diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp index adcbe5858bc78e..ef66348a83125c 100644 --- a/clang/lib/Parse/Parser.cpp +++ b/clang/lib/Parse/Parser.cpp @@ -2690,6 +2690,13 @@ bool Parser::ParseModuleName( return true; } + // P3034R1: Module Declarations Shouldn’t be Macros + if (!IsImport && Tok.getLocation().isMacroID()) { + Diag(Tok, diag::err_module_decl_cannot_be_macros); + SkipUntil(tok::semi); + return true; + } + // Record this part of the module path. Path.push_back(std::make_pair(Tok.getIdentifierInfo(), Tok.getLocation())); ConsumeToken(); diff --git a/clang/test/CXX/cpp/cpp.module/p1.cppm b/clang/test/CXX/cpp/cpp.module/p1.cppm new file mode 100644 index 00000000000000..b439366db3fba0 --- /dev/null +++ b/clang/test/CXX/cpp/cpp.module/p1.cppm @@ -0,0 +1,13 @@ +// RUN: %clang_cc1 -std=c++20 -emit-module-interface %s -triple x86_64-linux-gnu -DTEST=1 -verify +// RUN: %clang_cc1 -std=c++20 -emit-module-interface %s -triple x86_64-linux-gnu -DTEST=2 -verify + +module; +export module x; +#include "version.h" +#if TEST == 1 +export module VERSION; // expected-error {{module declaration cannot be a macro}} +#endif // TEST == 1 + +#if TEST == 2 +export module A.B; // expected-error {{module declaration cannot be a macro}} +#endif // TEST == 2 diff --git a/clang/test/CXX/cpp/cpp.module/version.h b/clang/test/CXX/cpp/cpp.module/version.h new file mode 100644 index 00000000000000..4608934290950b --- /dev/null +++ b/clang/test/CXX/cpp/cpp.module/version.h @@ -0,0 +1,8 @@ +#ifndef VERSION_H +#define VERSION_H + +#define VERSION libv5 +#define A a +#define B b + +#endif diff --git a/clang/test/CXX/module/basic/basic.link/module-declaration.cpp b/clang/test/CXX/module/basic/basic.link/module-declaration.cpp index d71358cc7a571f..aa4bb52a57face 100644 --- a/clang/test/CXX/module/basic/basic.link/module-declaration.cpp +++ b/clang/test/CXX/module/basic/basic.link/module-declaration.cpp @@ -9,26 +9,26 @@ // // Module implementation for unknown and known module. (The former is ill-formed.) // RUN: %clang_cc1 -std=c++20 -I%t -fmodule-file=x.y=%t/x.y.pcm -verify -x c++ %t/M.cpp \ -// RUN: -DTEST=1 -DEXPORT= -DMODULE_NAME=z +// RUN: -DTEST=1 // RUN: %clang_cc1 -std=c++20 -I%t -fmodule-file=x=%t/x.pcm -fmodule-file=x.y=%t/x.y.pcm -verify -x c++ %t/M.cpp \ -// RUN: -DTEST=2 -DEXPORT= -DMODULE_NAME=x +// RUN: -DTEST=2 // // Module interface for unknown and known module. (The latter is ill-formed due to // redefinition.) // RUN: %clang_cc1 -std=c++20 -I%t -fmodule-file=x.y=%t/x.y.pcm -verify %t/M.cpp \ -// RUN: -DTEST=3 -DEXPORT=export -DMODULE_NAME=z +// RUN: -DTEST=3 // RUN: %clang_cc1 -std=c++20 -I%t -fmodule-file=x.y=%t/x.y.pcm -verify %t/M.cpp \ -// RUN: -DTEST=4 -DEXPORT=export -DMODULE_NAME=x +// RUN: -DTEST=4 // // Miscellaneous syntax. // RUN: %clang_cc1 -std=c++20 -I%t -fmodule-file=x.y=%t/x.y.pcm -verify %t/M.cpp \ -// RUN: -DTEST=7 -DEXPORT=export -DMODULE_NAME='z elderberry' +// RUN: -DTEST=7 // RUN: %clang_cc1 -std=c++20 -I%t -fmodule-file=x.y=%t/x.y.pcm -verify %t/M.cpp \ -// RUN: -DTEST=8 -DEXPORT=export -DMODULE_NAME='z [[]]' +// RUN: -DTEST=8 // RUN: %clang_cc1 -std=c++20 -I%t -fmodule-file=x.y=%t/x.y.pcm -verify %t/M.cpp \ -// RUN: -DTEST=9 -DEXPORT=export -DMODULE_NAME='z [[fancy]]' +// RUN: -DTEST=9 // RUN: %clang_cc1 -std=c++20 -I%t -fmodule-file=x.y=%t/x.y.pcm -verify %t/M.cpp \ -// RUN: -DTEST=10 -DEXPORT=export -DMODULE_NAME='z [[maybe_unused]]' +// RUN: -DTEST=10 //--- x.cppm export module x; @@ -40,15 +40,20 @@ int c; //--- M.cpp -EXPORT module MODULE_NAME; -#if TEST == 7 -// expected-error@-2 {{expected ';'}} expected-error@-2 {{a type specifier is required}} +#if TEST == 1 +module z; // expected-error {{module 'z' not found}} +#elif TEST == 2 +module x; // expected-no-diagnostics +#elif TEST == 3 +export module z; // expected-no-diagnostics +#elif TEST == 4 +export module x; // expected-no-diagnostics +#elif TEST == 7 +export module z elderberry; // expected-error {{expected ';'}} expected-error {{a type specifier is required}} #elif TEST == 9 -// expected-warning@-4 {{unknown attribute 'fancy' ignored}} +export module z [[fancy]]; // expected-warning {{unknown attribute 'fancy' ignored}} #elif TEST == 10 -// expected-error-re@-6 {{'maybe_unused' attribute cannot be applied to a module{{$}}}} -#elif TEST == 1 -// expected-error@-8 {{module 'z' not found}} +export module z [[maybe_unused]]; // expected-error-re {{'maybe_unused' attribute cannot be applied to a module{{$}}}} #else // expected-no-diagnostics #endif diff --git a/clang/test/CXX/module/dcl.dcl/dcl.module/dcl.module.import/p1.cppm b/clang/test/CXX/module/dcl.dcl/dcl.module/dcl.module.import/p1.cppm index 873e4c0edeac25..074589ccc26926 100644 --- a/clang/test/CXX/module/dcl.dcl/dcl.module/dcl.module.import/p1.cppm +++ b/clang/test/CXX/module/dcl.dcl/dcl.module/dcl.module.import/p1.cppm @@ -35,9 +35,9 @@ int use_3 = c; // expected-error {{use of undeclared identifier 'c'}} //--- test.cpp #ifdef INTERFACE -export module MODULE_NAME; +export module MODULE_NAME; // expected-error {{module declaration cannot be a macro}} #else -module MODULE_NAME; +module MODULE_NAME; // expected-error {{module declaration cannot be a macro}} #endif import x; diff --git a/clang/test/SemaCXX/modules.cppm b/clang/test/SemaCXX/modules.cppm index 41204be76eafa1..75bbc5366d4a71 100644 --- a/clang/test/SemaCXX/modules.cppm +++ b/clang/test/SemaCXX/modules.cppm @@ -7,6 +7,10 @@ // expected-no-diagnostics #endif +#if TEST == 3 +// expected-error {{module declaration cannot be a macro}} +#endif // TEST == 3 + export module foo; static int m; diff --git a/clang/www/cxx_status.html b/clang/www/cxx_status.html index 0996abc2405857..8ae9a25caf3604 100755 --- a/clang/www/cxx_status.html +++ b/clang/www/cxx_status.html @@ -182,7 +182,7 @@ <h2 id="cxx26">C++2c implementation status</h2> <tr> <td>Module Declarations Shouldn’t be Macros</td> <td><a href="https://wg21.link/P3034R1">P3034R1</a> (<a href="#dr">DR</a>)</td> - <td class="none" align="center">No</td> + <td class="unreleased" align="center">Clang 19</td> </tr> <tr> <td>Trivial infinite loops are not Undefined Behavior</td> _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits