On Fri, May 24, 2024 at 11:24:38AM -0400, Jason Merrill wrote: > On 5/24/24 11:20, Nathaniel Shead wrote: > > This is just a small improvement to a diagnostic. I thought about also > > adding an inform to suggest something like "standard library headers > > should be included in the GMF" or somesuch, but I'm not sure that'll be > > especially valuable and may be confusing if this particular error is > > caused some other way. > > > > Bootstrapped and regtested (so far just modules.exp) on > > x86_64-pc-linux-gnu, OK for trunk if full regtest succeeds? > > > > -- >8 -- > > > > If a user mistakenly includes a standard library header within the > > module purview, they currently get a confusing "declaration conflicts > > with builtin" error. This patch updates the message to include "in > > module", to help guide the user towards the likely cause. > > > > gcc/cp/ChangeLog: > > > > * module.cc (module_may_redeclare): Update error message. > > > > gcc/testsuite/ChangeLog: > > > > * g++.dg/modules/enum-12.C: Test for updated error. > > > > Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com> > > --- > > gcc/cp/module.cc | 9 ++++++++- > > gcc/testsuite/g++.dg/modules/enum-12.C | 2 +- > > 2 files changed, 9 insertions(+), 2 deletions(-) > > > > diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc > > index 6cd7d9e0b93..60cf3ebc468 100644 > > --- a/gcc/cp/module.cc > > +++ b/gcc/cp/module.cc > > @@ -19140,7 +19140,14 @@ module_may_redeclare (tree olddecl, tree newdecl) > > decl = newdecl ? newdecl : olddecl; > > location_t loc = newdecl ? DECL_SOURCE_LOCATION (newdecl) : > > input_location; > > if (DECL_IS_UNDECLARED_BUILTIN (olddecl)) > > - error_at (loc, "declaration %qD conflicts with builtin", decl); > > + { > > + if (newdecl_attached_p) > > + error_at (loc, "declaring %qD in module %qs conflicts with builtin", > > Maybe "with builtin in global module"?
Yup, that's even clearer, thanks. > > > + decl, new_mod->get_flatname ()); > > + else > > + error_at (loc, "declaring %qD in global module conflicts with builtin", > > I'm not sure mentioning the global module adds anything in this case? > I'd done it for consistency with the other cases in case we ever somehow reached this code path, but happy to remove since this should always be a problem regardless. So maybe something like this? -- >8 -- If a user mistakenly includes a standard library header within the module purview, they currently get a confusing "declaration conflicts with builtin" error. This patch updates the message to include "in module", to help guide the user towards the likely cause. gcc/cp/ChangeLog: * module.cc (module_may_redeclare): Update error message. gcc/testsuite/ChangeLog: * g++.dg/modules/enum-12.C: Test for updated error. Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com> --- gcc/cp/module.cc | 8 +++++++- gcc/testsuite/g++.dg/modules/enum-12.C | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index 6cd7d9e0b93..3f8f84bb9fd 100644 --- a/gcc/cp/module.cc +++ b/gcc/cp/module.cc @@ -19140,7 +19140,13 @@ module_may_redeclare (tree olddecl, tree newdecl) decl = newdecl ? newdecl : olddecl; location_t loc = newdecl ? DECL_SOURCE_LOCATION (newdecl) : input_location; if (DECL_IS_UNDECLARED_BUILTIN (olddecl)) - error_at (loc, "declaration %qD conflicts with builtin", decl); + { + if (newdecl_attached_p) + error_at (loc, "declaring %qD in module %qs conflicts with builtin " + "in global module", decl, new_mod->get_flatname ()); + else + error_at (loc, "declaration %qD conflicts with builtin", decl); + } else if (DECL_LANG_SPECIFIC (old_inner) && DECL_MODULE_IMPORT_P (old_inner)) { auto_diagnostic_group d; diff --git a/gcc/testsuite/g++.dg/modules/enum-12.C b/gcc/testsuite/g++.dg/modules/enum-12.C index 064f220dedf..cf8f445e076 100644 --- a/gcc/testsuite/g++.dg/modules/enum-12.C +++ b/gcc/testsuite/g++.dg/modules/enum-12.C @@ -4,7 +4,7 @@ export module foo; namespace std { - enum class align_val_t : decltype(sizeof(int)) {}; // { dg-error "conflicts with builtin" } + enum class align_val_t : decltype(sizeof(int)) {}; // { dg-error "in module .foo. conflicts with builtin" } } // { dg-prune-output "not writing module" } -- 2.43.2