aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2020-05-19 07:58:33 +0200
committerRichard Biener <rguenther@suse.de>2020-05-20 09:39:49 +0200
commit4a88caf21a0a85129f6c985ca13ba3eb54ff5366 (patch)
treec76fd0b16bd0bf84e405c298ce7617b1e357d8d6 /gcc
parentdfa4fcdba374ed44d4aa1a22b2738f3f5c5b37af (diff)
downloadgcc-4a88caf21a0a85129f6c985ca13ba3eb54ff5366.zip
gcc-4a88caf21a0a85129f6c985ca13ba3eb54ff5366.tar.gz
gcc-4a88caf21a0a85129f6c985ca13ba3eb54ff5366.tar.bz2
c/95141 - fix bogus integer overflow warning
This fixes an integer overflow warning that ultimatively happens because of TREE_OVERFLOW propagating through transforms and the existing guard against this, 375 if (TREE_OVERFLOW_P (ret) 376 && !TREE_OVERFLOW_P (op0) 377 && !TREE_OVERFLOW_P (op1)) 378 overflow_warning (EXPR_LOC_OR_LOC (expr, input_location, being insufficient. Rather than trying to use sth like walk_tree to exhaustively walk operands (with the possibility of introducing quadraticness when folding larger expressions recursively) the following amends the above with an ad-hoc test for a binary op0 with a possibly constant op1. 2020-05-30 Richard Biener <rguenther@suse.de> PR c/95141 gcc/c * c-fold.c (c_fully_fold_internal): Enhance guard on overflow_warning. gcc/testsuite * gcc.dg/pr95141.c: New testcase.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/c/c-fold.c1
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr95141.c8
4 files changed, 20 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fdaa94a..3133b3c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2020-05-30 Richard Biener <rguenther@suse.de>
+
+ PR c/95141
+ * c-fold.c (c_fully_fold_internal): Enhance guard on
+ overflow_warning.
+
2020-05-20 Kito Cheng <kito.cheng@sifive.com>
PR target/90811
diff --git a/gcc/c/c-fold.c b/gcc/c/c-fold.c
index 63becfe..bd21d24 100644
--- a/gcc/c/c-fold.c
+++ b/gcc/c/c-fold.c
@@ -374,6 +374,7 @@ c_fully_fold_internal (tree expr, bool in_init, bool *maybe_const_operands,
ret = fold (expr);
if (TREE_OVERFLOW_P (ret)
&& !TREE_OVERFLOW_P (op0)
+ && !(BINARY_CLASS_P (op0) && TREE_OVERFLOW_P (TREE_OPERAND (op0, 1)))
&& !TREE_OVERFLOW_P (op1))
overflow_warning (EXPR_LOC_OR_LOC (expr, input_location), ret, expr);
if (code == LSHIFT_EXPR
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 48671f1..4010257 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2020-05-30 Richard Biener <rguenther@suse.de>
+
+ PR c/95141
+ * gcc.dg/pr95141.c: New testcase.
+
2020-05-19 Alex Coplan <alex.coplan@arm.com>
PR target/94591
diff --git a/gcc/testsuite/gcc.dg/pr95141.c b/gcc/testsuite/gcc.dg/pr95141.c
new file mode 100644
index 0000000..b6cbba2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr95141.c
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+
+#include <stdint.h>
+
+uint64_t test(uint8_t IA1)
+{
+ return (uint8_t)(IA1 & 158) & 1UL; /* { dg-bogus "integer overflow" } */
+}