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