[PR c++/82710] false positive paren warning
authorNathan Sidwell <nathan@acm.org>
Fri, 3 Nov 2017 13:16:06 +0000 (13:16 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Fri, 3 Nov 2017 13:16:06 +0000 (13:16 +0000)
https://gcc.gnu.org/ml/gcc-patches/2017-11/msg00186.html
PR c++/82710
* decl.c (grokdeclarator): Protect MAYBE_CLASS things from paren
warning too.

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

From-SVN: r254371

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/pr82710.C

index e7ea5da008a6dbd92a772d717916f032a099b21b..590e3221c8ccb8463789cb4b818866ca95c945ad 100644 (file)
@@ -1,3 +1,9 @@
+2017-11-03  Nathan Sidwell  <nathan@acm.org>
+
+       PR c++/82710
+       * decl.c (grokdeclarator): Protect MAYBE_CLASS things from paren
+       warning too.
+
 2017-11-02  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/81957
index 7c6f85724df53ae2d7631a029e31a5b9e2b69737..0ce8f2d343589677e7e8113179a345f8f5b69a37 100644 (file)
@@ -10795,13 +10795,15 @@ grokdeclarator (const cp_declarator *declarator,
         to be a constructor call.  */
       if (decl_context != PARM
          && 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
+         /* If the type is class-like and the inner name used a
+            global namespace qualifier, we need the parens.
+            Unfortunately all we can tell is whether a qualified name
+            was used or not.  */
+         && !(inner_declarator
               && inner_declarator->kind == cdk_id
-              && inner_declarator->u.id.qualifying_scope))
+              && 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 (declarator->kind == cdk_id || declarator->kind == cdk_decomp)
index 8159009a85afa58f1a727e6fe8d3a2475f4c4fad..e40224e5564498f416cea7d216f14a6fcad7a6df 100644 (file)
@@ -1,3 +1,8 @@
+2017-11-03  Nathan Sidwell  <nathan@acm.org>
+
+       PR c++/82710
+       * g++.dg/warn/pr82710.C: More cases.
+
 2017-11-03  Richard Sandiford  <richard.sandiford@linaro.org>
 
        * gcc.dg/pr82809.c: New test.
index a1f9247129ea8bcee0348e41a6a8ee8a31f33a13..93585eacf99f1db2694146171a37652b19b4016d 100644 (file)
@@ -1,7 +1,10 @@
-// { dg-additional-options -Wparentheses }
+// { dg-do compile { target c++11 } }
+// { dg-additional-options "-Wparentheses -Wno-non-template-friend" }
 
 // the MVP warning triggered on a friend decl.  */
 class X;
+enum class Q {}; // C++ 11ness
+enum R {};
 
 namespace here 
 {
@@ -9,6 +12,9 @@ namespace here
   X friendFunc1();
   X *friendFunc2 ();
   int friendFunc3 ();
+  int bob ();
+  Q bill ();
+  R ben ();
 }
 
 namespace nm
@@ -19,6 +25,9 @@ namespace nm
     void friendFunc1 ();
     void friendFunc2 ();
     void friendFunc3 ();
+    int bob ();
+    Q bill ();
+    R ben ();
   }
 
   class TestClass
@@ -28,5 +37,12 @@ namespace nm
     friend X *::here::friendFunc2 ();
     friend int (::here::friendFunc3 ()); // { dg-warning "" }
   };
+
+  template <typename T> class X
+  {
+    friend typename T::frob (::here::bob ());
+    friend Q (::here::bill ());
+    friend R (::here::ben ());
+  };
 }