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" }