re PR c++/51064 (False Positive for -Wparentheses)
authorPaolo Carlini <paolo.carlini@oracle.com>
Wed, 4 Jan 2012 16:39:53 +0000 (16:39 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 4 Jan 2012 16:39:53 +0000 (16:39 +0000)
/cp
2012-01-04  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/51064
* pt.c (tsubst_copy_and_build): Maybe set TREE_NO_WARNING on
the tree returned by build_x_binary_op.

/testsuite
2012-01-04  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/51064
* g++.dg/warn/Wparentheses-26.C: New.

From-SVN: r182880

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/Wparentheses-26.C [new file with mode: 0644]

index f4f491d..d889d29 100644 (file)
@@ -1,3 +1,9 @@
+2012-01-04  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/51064
+       * pt.c (tsubst_copy_and_build): Maybe set TREE_NO_WARNING on
+       the tree returned by build_x_binary_op.
+
 2012-01-03  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/51738
index 20f67aa..77e3388 100644 (file)
@@ -13563,18 +13563,23 @@ tsubst_copy_and_build (tree t,
     case GT_EXPR:
     case MEMBER_REF:
     case DOTSTAR_EXPR:
-      return build_x_binary_op
-       (TREE_CODE (t),
-        RECUR (TREE_OPERAND (t, 0)),
-        (TREE_NO_WARNING (TREE_OPERAND (t, 0))
-         ? ERROR_MARK
-         : TREE_CODE (TREE_OPERAND (t, 0))),
-        RECUR (TREE_OPERAND (t, 1)),
-        (TREE_NO_WARNING (TREE_OPERAND (t, 1))
-         ? ERROR_MARK
-         : TREE_CODE (TREE_OPERAND (t, 1))),
-        /*overload=*/NULL,
-        complain);
+      {
+       tree r = build_x_binary_op
+         (TREE_CODE (t),
+          RECUR (TREE_OPERAND (t, 0)),
+          (TREE_NO_WARNING (TREE_OPERAND (t, 0))
+           ? ERROR_MARK
+           : TREE_CODE (TREE_OPERAND (t, 0))),
+          RECUR (TREE_OPERAND (t, 1)),
+          (TREE_NO_WARNING (TREE_OPERAND (t, 1))
+           ? ERROR_MARK
+           : TREE_CODE (TREE_OPERAND (t, 1))),
+          /*overload=*/NULL,
+          complain);
+       if (EXPR_P (r) && TREE_NO_WARNING (t))
+         TREE_NO_WARNING (r) = TREE_NO_WARNING (t);
+       return r;
+      }
 
     case SCOPE_REF:
       return tsubst_qualified_id (t, args, complain, in_decl, /*done=*/true,
index 0982a9f..373ae01 100644 (file)
@@ -1,3 +1,8 @@
+2012-01-04  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/51064
+       * g++.dg/warn/Wparentheses-26.C: New.
+
 2012-01-04  Mikael Morin  <mikael@gcc.gnu.org>
 
        * gfortran.dg/elemental_optional_args_2.f90: New test.
diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-26.C b/gcc/testsuite/g++.dg/warn/Wparentheses-26.C
new file mode 100644 (file)
index 0000000..6fd4417
--- /dev/null
@@ -0,0 +1,26 @@
+// PR c++/51064
+// { dg-options "-Wparentheses" }
+
+template<int i, int j = ((i + 7) >> 3)> class foo1 { };
+typedef foo1<10> bar1;
+
+template<int i, int j = (i + 7 >> 3)> class foo2 { };
+typedef foo2<10> bar2;  // { dg-warning "suggest parentheses around '\\+'" }
+
+template<int i, int j = (100 >> (i + 2))> class foo3 { };
+typedef foo3<3> bar3;
+
+template<int i, int j = (100 >> i + 2)> class foo4 { }; 
+typedef foo4<3> bar4;   // { dg-warning "suggest parentheses around '\\+'" }
+
+template<int i, int j = (i + 7) | 3> class foo5 { };
+typedef foo5<10> bar5;
+
+template<int i, int j = i + 7 | 3> class foo6 { };
+typedef foo6<10> bar6;  // { dg-warning "suggest parentheses around arithmetic" }
+
+template<int i, int j = 3 | (i + 7)> class foo7 { };
+typedef foo7<10> bar7;
+
+template<int i, int j = 3 | i + 7> class foo8 { };
+typedef foo8<10> bar8;  // { dg-warning "suggest parentheses around arithmetic" }