aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/match.pd6
-rw-r--r--gcc/testsuite/gcc.dg/Wint-in-bool-context-4.c35
2 files changed, 39 insertions, 2 deletions
diff --git a/gcc/match.pd b/gcc/match.pd
index 41f9e6d..097ed2e 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -3401,13 +3401,15 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(cmp @0 @2)))))
/* Both signed and unsigned lshift produce the same result, so use
- the form that minimizes the number of conversions. */
+ the form that minimizes the number of conversions. Postpone this
+ transformation until after shifts by zero have been folded. */
(simplify
(convert (lshift:s@0 (convert:s@1 @2) INTEGER_CST@3))
(if (INTEGRAL_TYPE_P (type)
&& tree_nop_conversion_p (type, TREE_TYPE (@0))
&& INTEGRAL_TYPE_P (TREE_TYPE (@2))
- && TYPE_PRECISION (TREE_TYPE (@2)) <= TYPE_PRECISION (type))
+ && TYPE_PRECISION (TREE_TYPE (@2)) <= TYPE_PRECISION (type)
+ && !integer_zerop (@3))
(lshift (convert @2) @3)))
/* Simplifications of conversions. */
diff --git a/gcc/testsuite/gcc.dg/Wint-in-bool-context-4.c b/gcc/testsuite/gcc.dg/Wint-in-bool-context-4.c
new file mode 100644
index 0000000..0e96dd7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/Wint-in-bool-context-4.c
@@ -0,0 +1,35 @@
+/* PR c/102245 */
+/* { dg-options "-Wint-in-bool-context" } */
+/* { dg-do compile } */
+
+_Bool test1(_Bool x)
+{
+ return !(x << 0); /* { dg-warning "boolean context" } */
+}
+
+_Bool test2(_Bool x)
+{
+ return !(x << 1); /* { dg-warning "boolean context" } */
+}
+
+_Bool test3(_Bool x, int y)
+{
+ return !(x << y); /* { dg-warning "boolean context" } */
+}
+
+_Bool test4(int x, int y)
+{
+ return !(x << y); /* { dg-warning "boolean context" } */
+}
+
+_Bool test5(int x, int y)
+{
+ return !((x << y) << 0); /* { dg-warning "boolean context" } */
+}
+
+int test6(_Bool x)
+{
+ int v = 0;
+ return (v & ~1L) | (1L & (x << 0)); /* { dg-bogus "boolean context" } */
+}
+