On Tue, Jun 24, 2025 at 01:03:53PM +0200, Jakub Jelinek wrote:
> 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");

Maybe it would be nice to add a note/fixit that users can now work
around this error by marking main as 'extern "C++"'?  But overall LGTM.

>        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