[clang] [clang] Add test for CWG2811 "Clarify "use" of main" (PR #96168)
Vlad Serebrennikov via cfe-commits
cfe-commits at lists.llvm.org
Thu Jun 20 06:46:31 PDT 2024
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.vladislav at gmail.com>
Date: Thu, 20 Jun 2024 14:07:37 +0300
Subject: [PATCH 1/3] [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 at -1 {{expressions that refer to 'main' are an extension}}
+ };
+ using T2 = decltype(main);
+ // expected-error at -1 {{expressions that refer to 'main' are an extension}}
+}
+
+using T = decltype(main);
+// expected-error at -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.vladislav at gmail.com>
Date: Thu, 20 Jun 2024 15:56:21 +0300
Subject: [PATCH 2/3] 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 at -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.vladislav at gmail.com>
Date: Thu, 20 Jun 2024 16:46:02 +0300
Subject: [PATCH 3/3] 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 at -1 {{expressions that refer to 'main' are an extension}}
+ // expected-error at -1 {{expressions that refer to 'main' are a Clang extension}}
};
using T2 = decltype(main);
- // expected-error at -1 {{expressions that refer to 'main' are an extension}}
+ // expected-error at -1 {{expressions that refer to 'main' are a Clang extension}}
}
using T = decltype(main);
-// expected-error at -1 {{expressions that refer to 'main' are an extension}}
+// expected-error at -1 {{expressions that refer to 'main' are a Clang extension}}
int main();
More information about the cfe-commits
mailing list