-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[clang] Add test for CWG2811 "Clarify "use" of main" #96168
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-clang Author: Vlad Serebrennikov (Endilll) ChangesThis patch covers CWG2811 "Clarify "use" of main", basically adding a test for To my understanding, the diagnostic message is based on the wording, so I updated it based on the new wording. I also replaces "ISO C++ requires" with a phrasing that explicitly says "extension". Full diff: https://github.com/llvm/llvm-project/pull/96168.diff 4 Files Affected:
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>
|
I think I prefer the current wording, it's clearer that it's not conforming (at the very least we should say something like "clang extension". and maybe "referring to main is a clang extension". do we have test that this is fine?
|
As someone who was a user of Clang not so long ago, I have to say that the only thing "ISO C++ requires" conveyed to me was "you're doing something wrong". For me it never had a clear interpretation "you're asking for an extension, but we're not giving it to you". On the other hand, I believe the word "extension" is clearly understood to describe something outside of ISO C++, somewhat by definition. At least that would match my understanding 3-4 years ago. CC @AaronBallman I remember we discussed it offline a while ago. |
Thank you, I added the test. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM if @AaronBallman is happy
("expressions that... are an extensions" still sounds weird to me, cf previous comment)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!
This patch covers [CWG2811](https://cplusplus.github.io/CWG/issues/2811.html) "Clarify "use" of main", basically adding a test for `-Wmain`, focusing on usages of `main` in unevaluated contexts. To my understanding, the diagnostic message is based on the wording, so I updated it based on the new wording. I also replaces "ISO C++ requires" with a phrasing that explicitly says "extension".
This patch covers CWG2811 "Clarify "use" of main", basically adding a test for
-Wmain
, focusing on usages ofmain
in unevaluated contexts.To my understanding, the diagnostic message is based on the wording, so I updated it based on the new wording. I also replaces "ISO C++ requires" with a phrasing that explicitly says "extension".