From: Marek Polacek Date: Wed, 28 Oct 2020 18:45:27 +0000 (-0400) Subject: c++: Improve the MVP -Wparentheses diagnostic. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=24fb1d9c5855900b5229d8db445eba515c8375e3;p=gcc.git 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. --- diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 2de4e1657fb..ee3c353935d 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 234079559b9..d65b408a6f5 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 00000000000..4d371c5b093 --- /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 "" } */ +}