aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2012-01-04 16:39:53 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2012-01-04 16:39:53 +0000
commita10bf1f989bf224536a92292b55ff915d7dbf272 (patch)
treed85df6a2ce55f86d7734a6af45e5c6fca414c571 /gcc
parente2b30a444101f22a67c1f6b6ba67988ed1596f91 (diff)
downloadgcc-a10bf1f989bf224536a92292b55ff915d7dbf272.zip
gcc-a10bf1f989bf224536a92292b55ff915d7dbf272.tar.gz
gcc-a10bf1f989bf224536a92292b55ff915d7dbf272.tar.bz2
re PR c++/51064 (False Positive for -Wparentheses)
/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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c29
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/warn/Wparentheses-26.C26
4 files changed, 54 insertions, 12 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index f4f491d..d889d29 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 20f67aa..77e3388 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -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,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0982a9f..373ae01 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..6fd4417
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wparentheses-26.C
@@ -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" }