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", + decl, new_mod->get_flatname ()); + else + error_at (loc, "declaring %qD in global module 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