https://gcc.gnu.org/g:28b508233a12c13295f960a2cb8a4864879acfb4
commit r15-830-g28b508233a12c13295f960a2cb8a4864879acfb4 Author: Nathaniel Shead <nathanielosh...@gmail.com> Date: Sat May 25 01:03:54 2024 +1000 c++/modules: Improve diagnostic when redeclaring builtin in module [PR102345] 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. PR c++/102345 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> Diff: --- 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" }