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" }

Reply via email to