c++: Improve redeclared parameter name diagnostic [PR94588]
authorMarek Polacek <polacek@redhat.com>
Mon, 13 Apr 2020 23:06:39 +0000 (19:06 -0400)
committerMarek Polacek <polacek@redhat.com>
Tue, 14 Apr 2020 03:12:31 +0000 (23:12 -0400)
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".

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

* g++.dg/diagnostic/redeclaration-1.C: Add dg-message.

gcc/cp/ChangeLog
gcc/cp/name-lookup.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/diagnostic/redeclaration-1.C

index 65b648a3edce4ac4e86863f0c36a61ece1d9c063..7d742c15ba889b4afa76c57240efab6e245c2946 100644 (file)
@@ -1,3 +1,8 @@
+2020-04-13  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/94588
+       * name-lookup.c (check_local_shadow): Add an inform call.
+
 2020-04-13  Patrick Palka  <ppalka@redhat.com>
 
        PR c++/94521
index 8dd0b0d723e76d8ced4f949e29d81c6e716fdd1c..9b68b15be602a0666ce29c7c6af468997c60536b 100644 (file)
@@ -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;
            }
        }
index 723d4841016559e85b0b59f66d9cd4587d913708..2035cf6fd1faa4986feb2a4c3994ca5dab6682d5 100644 (file)
@@ -1,3 +1,8 @@
+2020-04-13  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/94588
+       * g++.dg/diagnostic/redeclaration-1.C: Add dg-message.
+
 2020-04-13  Martin Sebor  <msebor@redhat.com>
 
        PR c/92326
index a41a2b8f1c4b5c90bfc1f56e426e8c996c60d063..f0e43d414a864599434ebad5760f500dffe0c028 100644 (file)
@@ -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);