Commit dfa65d3f by Nathan Sidwell Committed by Nathan Sidwell

[PR c++/82710] false positive paren warning

https://gcc.gnu.org/ml/gcc-patches/2017-11/msg00119.html
	PR c++/82710
	* decl.c (grokdeclarator): Don't warn when parens protect a return
	type from a qualified name.

	PR c++/82710
	* g++.dg/warn/pr82710.C: New.

From-SVN: r254349
parent e10dbae3
2017-11-02 Nathan Sidwell <nathan@acm.org>
PR c++/82710
* decl.c (grokdeclarator): Don't warn when parens protect a return
type from a qualified name.
2017-11-01 Nathan Sidwell <nathan@acm.org> 2017-11-01 Nathan Sidwell <nathan@acm.org>
* cp-tree.h (enum cp_identifier_kind): Delete cik_newdel_op. * cp-tree.h (enum cp_identifier_kind): Delete cik_newdel_op.
......
...@@ -10788,18 +10788,25 @@ grokdeclarator (const cp_declarator *declarator, ...@@ -10788,18 +10788,25 @@ grokdeclarator (const cp_declarator *declarator,
attr_flags); attr_flags);
} }
inner_declarator = declarator->declarator;
/* We don't want to warn in parmeter context because we don't /* We don't want to warn in parmeter context because we don't
yet know if the parse will succeed, and this might turn out yet know if the parse will succeed, and this might turn out
to be a constructor call. */ to be a constructor call. */
if (decl_context != PARM if (decl_context != PARM
&& declarator->parenthesized != UNKNOWN_LOCATION) && declarator->parenthesized != UNKNOWN_LOCATION
/* If the type is a class and the inner name used a global
namespace qualifier, we need the parens. Unfortunately
all we can tell is that a qualified name was used. */
&& !(CLASS_TYPE_P (type)
&& inner_declarator
&& inner_declarator->kind == cdk_id
&& inner_declarator->u.id.qualifying_scope))
warning_at (declarator->parenthesized, OPT_Wparentheses, warning_at (declarator->parenthesized, OPT_Wparentheses,
"unnecessary parentheses in declaration of %qs", name); "unnecessary parentheses in declaration of %qs", name);
if (declarator->kind == cdk_id || declarator->kind == cdk_decomp) if (declarator->kind == cdk_id || declarator->kind == cdk_decomp)
break; break;
inner_declarator = declarator->declarator;
switch (declarator->kind) switch (declarator->kind)
{ {
case cdk_array: case cdk_array:
......
2017-11-02 Nathan Sidwell <nathan@acm.org> 2017-11-02 Nathan Sidwell <nathan@acm.org>
PR c++/82710
* g++.dg/warn/pr82710.C: New.
* g++.dg/lang-dump.C: New. * g++.dg/lang-dump.C: New.
2017-11-02 Richard Biener <rguenther@suse.de> 2017-11-02 Richard Biener <rguenther@suse.de>
......
// { dg-additional-options -Wparentheses }
// the MVP warning triggered on a friend decl. */
class X;
namespace here
{
// these friends
X friendFunc1();
X *friendFunc2 ();
int friendFunc3 ();
}
namespace nm
{
namespace here
{
// Not these friends
void friendFunc1 ();
void friendFunc2 ();
void friendFunc3 ();
}
class TestClass
{
friend X (::here::friendFunc1 ()); // parens are needed
friend X *(::here::friendFunc2 ()); // { dg-warning "" }
friend X *::here::friendFunc2 ();
friend int (::here::friendFunc3 ()); // { dg-warning "" }
};
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment