[PR c++/82710] false positive paren warning
authorNathan Sidwell <nathan@acm.org>
Thu, 2 Nov 2017 18:26:29 +0000 (18:26 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Thu, 2 Nov 2017 18:26:29 +0000 (18:26 +0000)
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

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/pr82710.C [new file with mode: 0644]

index d3ffadf..7a7a589 100644 (file)
@@ -1,3 +1,9 @@
+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>
 
        * cp-tree.h (enum cp_identifier_kind): Delete cik_newdel_op.
index d88c78f..62bd3da 100644 (file)
@@ -10788,18 +10788,25 @@ grokdeclarator (const cp_declarator *declarator,
                                            attr_flags);
        }
 
+      inner_declarator = declarator->declarator;
+
       /* 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
         to be a constructor call.  */
       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,
                    "unnecessary parentheses in declaration of %qs", name);
       if (declarator->kind == cdk_id || declarator->kind == cdk_decomp)
        break;
 
-      inner_declarator = declarator->declarator;
-
       switch (declarator->kind)
        {
        case cdk_array:
index 641a9cc..bc4a207 100644 (file)
@@ -1,5 +1,8 @@
 2017-11-02  Nathan Sidwell  <nathan@acm.org>
 
+       PR c++/82710
+       * g++.dg/warn/pr82710.C: New.
+
        * g++.dg/lang-dump.C: New.
 
 2017-11-02  Richard Biener  <rguenther@suse.de>
diff --git a/gcc/testsuite/g++.dg/warn/pr82710.C b/gcc/testsuite/g++.dg/warn/pr82710.C
new file mode 100644 (file)
index 0000000..a1f9247
--- /dev/null
@@ -0,0 +1,32 @@
+// { 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 "" }
+  };
+}
+