https://gcc.gnu.org/g:ed7fc2b29ead88be30b40ec2c3c51495200b08c4

commit r16-1657-ged7fc2b29ead88be30b40ec2c3c51495200b08c4
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Tue Jun 24 19:00:11 2025 +0200

    c++: Implement C++26 P3618R0 - Allow attaching main to the global module 
[PR120773]
    
    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.
    
    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.

Diff:
---
 gcc/cp/decl.cc                        | 4 ++--
 gcc/testsuite/g++.dg/modules/main-2.C | 4 ++++
 gcc/testsuite/g++.dg/modules/main-3.C | 7 +++++++
 gcc/testsuite/g++.dg/parse/linkage5.C | 5 +++--
 gcc/testsuite/g++.dg/parse/linkage7.C | 7 +++++++
 gcc/testsuite/g++.dg/parse/linkage8.C | 5 +++++
 6 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc
index febdc89f89dd..95bccfbb585b 100644
--- a/gcc/cp/decl.cc
+++ b/gcc/cp/decl.cc
@@ -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 %<extern \"C++\"%>");
       if (module_attach_p ())
        error_at (location, "cannot attach %<::main%> to a named module");
       inlinep = 0;
diff --git a/gcc/testsuite/g++.dg/modules/main-2.C 
b/gcc/testsuite/g++.dg/modules/main-2.C
new file mode 100644
index 000000000000..8d17381c7fa3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/main-2.C
@@ -0,0 +1,4 @@
+// { dg-additional-options "-fmodules" }
+
+export module M;
+extern "C++" int main() {}
diff --git a/gcc/testsuite/g++.dg/modules/main-3.C 
b/gcc/testsuite/g++.dg/modules/main-3.C
new file mode 100644
index 000000000000..10a29360232d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/main-3.C
@@ -0,0 +1,7 @@
+// { dg-additional-options "-fmodules" }
+
+export module M;
+extern "C++" {
+  int main() {}
+}
+
diff --git a/gcc/testsuite/g++.dg/parse/linkage5.C 
b/gcc/testsuite/g++.dg/parse/linkage5.C
index 451406de69b2..1bd4736906c3 100644
--- a/gcc/testsuite/g++.dg/parse/linkage5.C
+++ b/gcc/testsuite/g++.dg/parse/linkage5.C
@@ -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
diff --git a/gcc/testsuite/g++.dg/parse/linkage7.C 
b/gcc/testsuite/g++.dg/parse/linkage7.C
new file mode 100644
index 000000000000..91caf265305b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/linkage7.C
@@ -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();
+}
diff --git a/gcc/testsuite/g++.dg/parse/linkage8.C 
b/gcc/testsuite/g++.dg/parse/linkage8.C
new file mode 100644
index 000000000000..b757ed55b559
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/linkage8.C
@@ -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" }

Reply via email to