aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2020-10-28 14:45:27 -0400
committerMarek Polacek <polacek@redhat.com>2020-10-28 18:02:05 -0400
commit24fb1d9c5855900b5229d8db445eba515c8375e3 (patch)
treed588d145655703722010e4cffffe040a0c0762bf
parent455ade18462e5076065b1970e21c622239797392 (diff)
downloadgcc-24fb1d9c5855900b5229d8db445eba515c8375e3.zip
gcc-24fb1d9c5855900b5229d8db445eba515c8375e3.tar.gz
gcc-24fb1d9c5855900b5229d8db445eba515c8375e3.tar.bz2
c++: Improve the MVP -Wparentheses diagnostic.
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.
-rw-r--r--gcc/cp/decl.c13
-rw-r--r--gcc/cp/parser.c4
-rw-r--r--gcc/testsuite/g++.dg/warn/mvp3.C30
3 files changed, 44 insertions, 3 deletions
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 2de4e16..ee3c353 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -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;
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 2340795..d65b408 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -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
index 0000000..4d371c5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/mvp3.C
@@ -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 "" } */
+}