2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-04-10 03:50:26 +08:00

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.
This commit is contained in:
Marek Polacek 2020-10-28 14:45:27 -04:00
parent 455ade1846
commit 24fb1d9c58
3 changed files with 44 additions and 3 deletions
gcc
cp
testsuite/g++.dg/warn

@ -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;

@ -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. */

@ -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 "" } */
}