https://github.com/Endilll updated https://github.com/llvm/llvm-project/pull/96168
>From 7ac89c2758965fec2dd007954735e59d793d6a59 Mon Sep 17 00:00:00 2001 From: Vlad Serebrennikov <serebrennikov.vladis...@gmail.com> Date: Thu, 20 Jun 2024 14:07:37 +0300 Subject: [PATCH 1/4] [clang] Add test for CWG2811 "Clarify "use" of main" --- .../clang/Basic/DiagnosticSemaKinds.td | 2 +- .../basic/basic.start/basic.start.init/p3.cpp | 4 ++-- clang/test/CXX/drs/cwg28xx.cpp | 19 +++++++++++++++++++ clang/www/cxx_dr_status.html | 2 +- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 14736784cff5f..b747d2637bd5f 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -964,7 +964,7 @@ def err_main_global_variable : def warn_main_redefined : Warning<"variable named 'main' with external linkage " "has undefined behavior">, InGroup<Main>; def ext_main_used : Extension< - "ISO C++ does not allow 'main' to be used by a program">, InGroup<Main>; + "expressions that refer to 'main' are an extension">, InGroup<Main>; /// parser diagnostics def ext_no_declarators : ExtWarn<"declaration does not declare anything">, diff --git a/clang/test/CXX/basic/basic.start/basic.start.init/p3.cpp b/clang/test/CXX/basic/basic.start/basic.start.init/p3.cpp index 506232ebacc4c..8f215172235c2 100644 --- a/clang/test/CXX/basic/basic.start/basic.start.init/p3.cpp +++ b/clang/test/CXX/basic/basic.start/basic.start.init/p3.cpp @@ -16,9 +16,9 @@ int main(int argc, char **argv) = delete; // expected-error {{'main' is not allowed to be deleted}} #else { - int (*pmain)(int, char**) = &main; // expected-error {{ISO C++ does not allow 'main' to be used by a program}} + int (*pmain)(int, char**) = &main; // expected-error {{expressions that refer to 'main' are an extension}} if (argc) - main(0, 0); // expected-error {{ISO C++ does not allow 'main' to be used by a program}} + main(0, 0); // expected-error {{expressions that refer to 'main' are an extension}} } #endif diff --git a/clang/test/CXX/drs/cwg28xx.cpp b/clang/test/CXX/drs/cwg28xx.cpp index da81eccc8dc22..049d90a1f7b20 100644 --- a/clang/test/CXX/drs/cwg28xx.cpp +++ b/clang/test/CXX/drs/cwg28xx.cpp @@ -6,6 +6,25 @@ // RUN: %clang_cc1 -std=c++23 -pedantic-errors -verify=expected,since-cxx20,since-cxx23 %s // RUN: %clang_cc1 -std=c++2c -pedantic-errors -verify=expected,since-cxx20,since-cxx23,since-cxx26 %s + +int main() {} // required for cwg2811 + +namespace cwg2811 { // cwg2811: 3.5 +#if __cplusplus >= 201103L +void f() { + (void)[&] { + using T = decltype(main); + // expected-error@-1 {{expressions that refer to 'main' are an extension}} + }; + using T2 = decltype(main); + // expected-error@-1 {{expressions that refer to 'main' are an extension}} +} + +using T = decltype(main); +// expected-error@-1 {{expressions that refer to 'main' are an extension}} +#endif +} // namespace cwg2811 + namespace cwg2819 { // cwg2819: 19 tentatively ready 2023-12-01 #if __cpp_constexpr >= 202306L constexpr void* p = nullptr; diff --git a/clang/www/cxx_dr_status.html b/clang/www/cxx_dr_status.html index dac38cedfcb75..d6b7c32dd844d 100755 --- a/clang/www/cxx_dr_status.html +++ b/clang/www/cxx_dr_status.html @@ -16675,7 +16675,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2> <td><a href="https://cplusplus.github.io/CWG/issues/2811.html">2811</a></td> <td>DR</td> <td>Clarify "use" of main</td> - <td class="unknown" align="center">Unknown</td> + <td class="full" align="center">Clang 3.5</td> </tr> <tr class="open" id="2812"> <td><a href="https://cplusplus.github.io/CWG/issues/2812.html">2812</a></td> >From 7043728a9b59ce6fb741f83adec0ae866b8d78fa Mon Sep 17 00:00:00 2001 From: Vlad Serebrennikov <serebrennikov.vladis...@gmail.com> Date: Thu, 20 Jun 2024 15:56:21 +0300 Subject: [PATCH 2/4] Add tests for a `main` function inside a namespace --- clang/test/CXX/drs/cwg28xx.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/clang/test/CXX/drs/cwg28xx.cpp b/clang/test/CXX/drs/cwg28xx.cpp index 049d90a1f7b20..66ffbdf5e0d2b 100644 --- a/clang/test/CXX/drs/cwg28xx.cpp +++ b/clang/test/CXX/drs/cwg28xx.cpp @@ -22,6 +22,11 @@ void f() { using T = decltype(main); // expected-error@-1 {{expressions that refer to 'main' are an extension}} + +int main(); + +using U = decltype(main); +using U2 = decltype(&main); #endif } // namespace cwg2811 >From f3bcd9da2fa99fb6bab913adb9139e76145b46a2 Mon Sep 17 00:00:00 2001 From: Vlad Serebrennikov <serebrennikov.vladis...@gmail.com> Date: Thu, 20 Jun 2024 16:46:02 +0300 Subject: [PATCH 3/4] Clarify that it's a Clang extension as @AaronBallman suggested --- clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 +- clang/test/CXX/basic/basic.start/basic.start.init/p3.cpp | 4 ++-- clang/test/CXX/drs/cwg28xx.cpp | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index b747d2637bd5f..8cdc05f360003 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -964,7 +964,7 @@ def err_main_global_variable : def warn_main_redefined : Warning<"variable named 'main' with external linkage " "has undefined behavior">, InGroup<Main>; def ext_main_used : Extension< - "expressions that refer to 'main' are an extension">, InGroup<Main>; + "expressions that refer to 'main' are a Clang extension">, InGroup<Main>; /// parser diagnostics def ext_no_declarators : ExtWarn<"declaration does not declare anything">, diff --git a/clang/test/CXX/basic/basic.start/basic.start.init/p3.cpp b/clang/test/CXX/basic/basic.start/basic.start.init/p3.cpp index 8f215172235c2..bdeb14b1af9e3 100644 --- a/clang/test/CXX/basic/basic.start/basic.start.init/p3.cpp +++ b/clang/test/CXX/basic/basic.start/basic.start.init/p3.cpp @@ -16,9 +16,9 @@ int main(int argc, char **argv) = delete; // expected-error {{'main' is not allowed to be deleted}} #else { - int (*pmain)(int, char**) = &main; // expected-error {{expressions that refer to 'main' are an extension}} + int (*pmain)(int, char**) = &main; // expected-error {{expressions that refer to 'main' are a Clang extension}} if (argc) - main(0, 0); // expected-error {{expressions that refer to 'main' are an extension}} + main(0, 0); // expected-error {{expressions that refer to 'main' are a Clang extension}} } #endif diff --git a/clang/test/CXX/drs/cwg28xx.cpp b/clang/test/CXX/drs/cwg28xx.cpp index 66ffbdf5e0d2b..549a4fd2d36b4 100644 --- a/clang/test/CXX/drs/cwg28xx.cpp +++ b/clang/test/CXX/drs/cwg28xx.cpp @@ -14,14 +14,14 @@ namespace cwg2811 { // cwg2811: 3.5 void f() { (void)[&] { using T = decltype(main); - // expected-error@-1 {{expressions that refer to 'main' are an extension}} + // expected-error@-1 {{expressions that refer to 'main' are a Clang extension}} }; using T2 = decltype(main); - // expected-error@-1 {{expressions that refer to 'main' are an extension}} + // expected-error@-1 {{expressions that refer to 'main' are a Clang extension}} } using T = decltype(main); -// expected-error@-1 {{expressions that refer to 'main' are an extension}} +// expected-error@-1 {{expressions that refer to 'main' are a Clang extension}} int main(); >From bee1bc5286842046ee498e812f98d3cf7d202555 Mon Sep 17 00:00:00 2001 From: Vlad Serebrennikov <serebrennikov.vladis...@gmail.com> Date: Thu, 20 Jun 2024 19:16:05 +0300 Subject: [PATCH 4/4] Reword the diagnostic per Aaron's offline suggestion --- clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 +- clang/test/CXX/basic/basic.start/basic.start.init/p3.cpp | 4 ++-- clang/test/CXX/drs/cwg28xx.cpp | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 8cdc05f360003..3edf72df4f6b8 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -964,7 +964,7 @@ def err_main_global_variable : def warn_main_redefined : Warning<"variable named 'main' with external linkage " "has undefined behavior">, InGroup<Main>; def ext_main_used : Extension< - "expressions that refer to 'main' are a Clang extension">, InGroup<Main>; + "referring to 'main' within an expression is a Clang extension">, InGroup<Main>; /// parser diagnostics def ext_no_declarators : ExtWarn<"declaration does not declare anything">, diff --git a/clang/test/CXX/basic/basic.start/basic.start.init/p3.cpp b/clang/test/CXX/basic/basic.start/basic.start.init/p3.cpp index bdeb14b1af9e3..6614003fb93dd 100644 --- a/clang/test/CXX/basic/basic.start/basic.start.init/p3.cpp +++ b/clang/test/CXX/basic/basic.start/basic.start.init/p3.cpp @@ -16,9 +16,9 @@ int main(int argc, char **argv) = delete; // expected-error {{'main' is not allowed to be deleted}} #else { - int (*pmain)(int, char**) = &main; // expected-error {{expressions that refer to 'main' are a Clang extension}} + int (*pmain)(int, char**) = &main; // expected-error {{referring to 'main' within an expression is a Clang extension}} if (argc) - main(0, 0); // expected-error {{expressions that refer to 'main' are a Clang extension}} + main(0, 0); // expected-error {{referring to 'main' within an expression is a Clang extension}} } #endif diff --git a/clang/test/CXX/drs/cwg28xx.cpp b/clang/test/CXX/drs/cwg28xx.cpp index 549a4fd2d36b4..e2d075d66547b 100644 --- a/clang/test/CXX/drs/cwg28xx.cpp +++ b/clang/test/CXX/drs/cwg28xx.cpp @@ -14,14 +14,14 @@ namespace cwg2811 { // cwg2811: 3.5 void f() { (void)[&] { using T = decltype(main); - // expected-error@-1 {{expressions that refer to 'main' are a Clang extension}} + // expected-error@-1 {{referring to 'main' within an expression is a Clang extension}} }; using T2 = decltype(main); - // expected-error@-1 {{expressions that refer to 'main' are a Clang extension}} + // expected-error@-1 {{referring to 'main' within an expression is a Clang extension}} } using T = decltype(main); -// expected-error@-1 {{expressions that refer to 'main' are a Clang extension}} +// expected-error@-1 {{referring to 'main' within an expression is a Clang extension}} int main(); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits