c++: Improve the MVP -Wparentheses diagnostic.
authorMarek Polacek <polacek@redhat.com>
Wed, 28 Oct 2020 18:45:27 +0000 (14:45 -0400)
committerMarek Polacek <polacek@redhat.com>
Wed, 28 Oct 2020 22:02:05 +0000 (18:02 -0400)
I noticed that declarator->parenthesized is, for this warning, only set
to the opening paren.  But we can easily make it a range and generate
a nicer diagnostic.  Moreover, we can then offer a fix-it hint.

TL;DR: This patch changes

mvp3.C:8:7: warning: unnecessary parentheses in declaration of ā€˜iā€™ [-Wparentheses]
    8 |   int (i);
      |       ^

to

mvp3.C:8:7: warning: unnecessary parentheses in declaration of ā€˜iā€™ [-Wparentheses]
    8 |   int (i);
      |       ^~~
mvp3.C:8:7: note: remove parentheses
    8 |   int (i);
      |       ^~~
      |       - -

Tested by using -fdiagnostics-generate-patch and verifying that the
generated patch DTRT.

gcc/cp/ChangeLog:

* decl.c (grokdeclarator): Offer a fix-it hint for the "unnecessary
parentheses in declaration" warning.
* parser.c (cp_parser_direct_declarator): When setting
declarator->parenthesized, use a location range.

gcc/testsuite/ChangeLog:

* g++.dg/warn/mvp3.C: New test.

gcc/cp/decl.c
gcc/cp/parser.c
gcc/testsuite/g++.dg/warn/mvp3.C [new file with mode: 0644]

index 2de4e1657fba8fbe07edf5e047b8b4e848e485ca..ee3c353935d006248a0f9fb99b2a37fa947defe6 100644 (file)
@@ -12037,8 +12037,17 @@ grokdeclarator (const cp_declarator *declarator,
               && inner_declarator->u.id.qualifying_scope
               && (MAYBE_CLASS_TYPE_P (type)
                   || TREE_CODE (type) == ENUMERAL_TYPE)))
-       warning_at (declarator->parenthesized, OPT_Wparentheses,
-                   "unnecessary parentheses in declaration of %qs", name);
+       {
+         if (warning_at (declarator->parenthesized, OPT_Wparentheses,
+                         "unnecessary parentheses in declaration of %qs",
+                         name))
+           {
+             gcc_rich_location iloc (declarator->parenthesized);
+             iloc.add_fixit_remove (get_start (declarator->parenthesized));
+             iloc.add_fixit_remove (get_finish (declarator->parenthesized));
+             inform (&iloc, "remove parentheses");
+           }
+       }
       if (declarator->kind == cdk_id || declarator->kind == cdk_decomp)
        break;
 
index 234079559b9b6854322c1394591c01e592ca601d..d65b408a6f5bbc28b527fb3d254b185185e79064 100644 (file)
@@ -21866,7 +21866,9 @@ cp_parser_direct_declarator (cp_parser* parser,
            open_paren = NULL;
        }
       if (open_paren)
-       declarator->parenthesized = open_paren->location;
+       declarator->parenthesized = make_location (open_paren->location,
+                                                  open_paren->location,
+                                                  close_paren->location);
     }
 
   /* If we entered a scope, we must exit it now.  */
diff --git a/gcc/testsuite/g++.dg/warn/mvp3.C b/gcc/testsuite/g++.dg/warn/mvp3.C
new file mode 100644 (file)
index 0000000..4d371c5
--- /dev/null
@@ -0,0 +1,30 @@
+// { dg-do compile }
+// { dg-options "-Wparentheses -fdiagnostics-show-caret" }
+// Test fix-it hints for the MVP warning.
+
+void
+g ()
+{
+  int (i); // { dg-warning "7:unnecessary parentheses" }
+/* { dg-begin-multiline-output "" }
+   int (i);
+       ^~~
+   { dg-end-multiline-output "" } */
+// { dg-message "7:remove parentheses" "" { target *-*-* } 8 }
+/* { dg-begin-multiline-output "" }
+   int (i);
+       ^~~
+       - -
+   { dg-end-multiline-output "" } */
+  int (fn(void)); // { dg-warning "7:unnecessary parentheses" }
+/* { dg-begin-multiline-output "" }
+   int (fn(void));
+       ^~~~~~~~~~
+   { dg-end-multiline-output "" } */
+// { dg-message "7:remove parentheses" "" { target *-*-* } 19 }
+/* { dg-begin-multiline-output "" }
+   int (fn(void));
+       ^~~~~~~~~~
+       -        -
+   { dg-end-multiline-output "" } */
+}