diff options
author | Marek Polacek <polacek@redhat.com> | 2020-10-28 14:45:27 -0400 |
---|---|---|
committer | Marek Polacek <polacek@redhat.com> | 2020-10-28 18:02:05 -0400 |
commit | 24fb1d9c5855900b5229d8db445eba515c8375e3 (patch) | |
tree | d588d145655703722010e4cffffe040a0c0762bf | |
parent | 455ade18462e5076065b1970e21c622239797392 (diff) | |
download | gcc-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.c | 13 | ||||
-rw-r--r-- | gcc/cp/parser.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/mvp3.C | 30 |
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 "" } */ +} |