While reviewing [basic.scope.param] I noticed we don't show the location
of the previous declaration when giving an error about "A parameter name
shall not be redeclared in the outermost block of the function definition".

Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?

        PR c++/94588
        * name-lookup.c (check_local_shadow): Add an inform call.

        * g++.dg/diagnostic/redeclaration-1.C: Add dg-message.
---
 gcc/cp/name-lookup.c                              | 9 ++++++---
 gcc/testsuite/g++.dg/diagnostic/redeclaration-1.C | 2 +-
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index 8dd0b0d723e..9b68b15be60 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -2670,8 +2670,8 @@ check_local_shadow (tree decl)
        }
       /* Don't complain if it's from an enclosing function.  */
       else if (DECL_CONTEXT (old) == current_function_decl
-         && TREE_CODE (decl) != PARM_DECL
-         && TREE_CODE (old) == PARM_DECL)
+              && TREE_CODE (decl) != PARM_DECL
+              && TREE_CODE (old) == PARM_DECL)
        {
          /* Go to where the parms should be and see if we find
             them there.  */
@@ -2681,11 +2681,14 @@ check_local_shadow (tree decl)
            /* Skip the ctor/dtor cleanup level.  */
            b = b->level_chain;
 
-         /* ARM $8.3 */
+         /* [basic.scope.param] A parameter name shall not be redeclared
+            in the outermost block of the function definition.  */
          if (b->kind == sk_function_parms)
            {
              error_at (DECL_SOURCE_LOCATION (decl),
                        "declaration of %q#D shadows a parameter", decl);
+             inform (DECL_SOURCE_LOCATION (old),
+                     "%q#D previously declared here", old);
              return;
            }
        }
diff --git a/gcc/testsuite/g++.dg/diagnostic/redeclaration-1.C 
b/gcc/testsuite/g++.dg/diagnostic/redeclaration-1.C
index a41a2b8f1c4..f0e43d414a8 100644
--- a/gcc/testsuite/g++.dg/diagnostic/redeclaration-1.C
+++ b/gcc/testsuite/g++.dg/diagnostic/redeclaration-1.C
@@ -1,5 +1,5 @@
 void
-foo (int i)
+foo (int i) // { dg-message "10:.int i. previously declared here" }
 {
   int i  // { dg-error "7:declaration of .int i. shadows a parameter" }
     (0);

base-commit: 09f041390245da60411a9f0e08c4bedf7430585a
-- 
Marek Polacek • Red Hat, Inc. • 300 A St, Boston, MA

Reply via email to