Hi!

The following patch implements the P3618R0 paper by tweaking pedwarn
condition, adjusting pedwarn wording, adjusting one testcase and adding 4
new ones.  The paper was voted in as DR, so it isn't guarded on C++ version.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2025-06-24  Jakub Jelinek  <ja...@redhat.com>

        PR c++/120773
        * decl.cc (grokfndecl): Implement C++26 P3618R0 - Allow attaching
        main to the global module.  Only pedwarn for current_lang_name
        other than lang_name_cplusplus and adjust pedwarn wording.

        * g++.dg/parse/linkage5.C: Don't expect error on
        extern "C++" int main ();.
        * g++.dg/parse/linkage7.C: New test.
        * g++.dg/parse/linkage8.C: New test.
        * g++.dg/modules/main-2.C: New test.
        * g++.dg/modules/main-3.C: New test.

--- gcc/cp/decl.cc.jj   2025-06-19 08:55:04.408676724 +0200
+++ gcc/cp/decl.cc      2025-06-23 17:47:13.942011687 +0200
@@ -11326,9 +11326,9 @@ grokfndecl (tree ctype,
                  "cannot declare %<::main%> to be %qs", "consteval");
       if (!publicp)
        error_at (location, "cannot declare %<::main%> to be static");
-      if (current_lang_depth () != 0)
+      if (current_lang_name != lang_name_cplusplus)
        pedwarn (location, OPT_Wpedantic, "cannot declare %<::main%> with a"
-                " linkage specification");
+                " linkage specification other than %<\"C++\"%>");
       if (module_attach_p ())
        error_at (location, "cannot attach %<::main%> to a named module");
       inlinep = 0;
--- gcc/testsuite/g++.dg/parse/linkage5.C.jj    2024-05-22 09:11:46.979234663 
+0200
+++ gcc/testsuite/g++.dg/parse/linkage5.C       2025-06-23 18:00:38.067742494 
+0200
@@ -1,5 +1,6 @@
 // { dg-do compile }
-// The main function shall not be declared with a linkage-specification.
+// The main function shall not be declared with a linkage-specification
+// other than "C++".
 
 extern "C" {
   int main();  // { dg-error "linkage" }
@@ -9,6 +10,6 @@ namespace foo {
   extern "C" int main();  // { dg-error "linkage" }
 }
 
-extern "C++" int main(); // { dg-error "linkage" }
+extern "C++" int main();
 
 extern "C" struct S { int main(); };  // OK
--- gcc/testsuite/g++.dg/parse/linkage7.C.jj    2025-06-23 18:01:17.622237056 
+0200
+++ gcc/testsuite/g++.dg/parse/linkage7.C       2025-06-23 18:01:32.385048426 
+0200
@@ -0,0 +1,7 @@
+// { dg-do compile }
+// The main function shall not be declared with a linkage-specification
+// other than "C++".
+
+extern "C++" {
+  int main();
+}
--- gcc/testsuite/g++.dg/parse/linkage8.C.jj    2025-06-23 18:01:39.830953283 
+0200
+++ gcc/testsuite/g++.dg/parse/linkage8.C       2025-06-23 18:01:57.657725492 
+0200
@@ -0,0 +1,5 @@
+// { dg-do compile }
+// The main function shall not be declared with a linkage-specification
+// other than "C++".
+
+extern "C" int main(); // { dg-error "linkage" }
--- gcc/testsuite/g++.dg/modules/main-2.C.jj    2025-06-23 18:25:17.058941644 
+0200
+++ gcc/testsuite/g++.dg/modules/main-2.C       2025-06-23 18:26:11.416253264 
+0200
@@ -0,0 +1,4 @@
+// { dg-additional-options "-fmodules" }
+
+export module M;
+extern "C++" int main() {}
--- gcc/testsuite/g++.dg/modules/main-3.C.jj    2025-06-23 18:26:20.393139580 
+0200
+++ gcc/testsuite/g++.dg/modules/main-3.C       2025-06-23 18:26:33.190977509 
+0200
@@ -0,0 +1,7 @@
+// { dg-additional-options "-fmodules" }
+
+export module M;
+extern "C++" {
+  int main() {}
+}
+

        Jakub

Reply via email to