On Tue, Jun 24, 2025 at 11:14:51AM -0400, Jason Merrill wrote: > On 6/24/25 10:16 AM, Nathaniel Shead wrote: > > 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. > > I suppose we could say "other than %<extern \"C++\"%>" to make that a little > clearer. OK with that tweak. > > I wouldn't object to a fixup but it sounds more complicated than it's worth > to have different fixups for the extern "C" { int main(); } and extern "C" > int main(); cases. > > Jason >
I think I wasn't totally clear sorry; here's a patch with what I meant. Tested on x86_64-pc-linux-gnu, OK for trunk? -- >8 -- Subject: [PATCH] c++: Add fix note for how to declare main in a module This patch adds a note to help users unfamiliar with modules terminology understand how to declare main in a named module since P3618. There doesn't appear to be an easy robust location available for "the start of this declaration" that I could find to attach a fixit to, but the explanation should suffice. gcc/cp/ChangeLog: * decl.cc (grokfndecl): Add explanation of how to attach to global module. Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com> --- gcc/cp/decl.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc index 95bccfbb585..4fe97ffbf8f 100644 --- a/gcc/cp/decl.cc +++ b/gcc/cp/decl.cc @@ -11330,7 +11330,12 @@ grokfndecl (tree ctype, pedwarn (location, OPT_Wpedantic, "cannot declare %<::main%> with a" " linkage specification other than %<extern \"C++\"%>"); if (module_attach_p ()) - error_at (location, "cannot attach %<::main%> to a named module"); + { + auto_diagnostic_group adg; + error_at (location, "cannot attach %<::main%> to a named module"); + inform (location, "use %<extern \"C++\"%> to attach it to the " + "global module instead"); + } inlinep = 0; publicp = 1; } -- 2.47.0