diff options
author | Richard Biener <rguenther@suse.de> | 2020-05-19 07:58:33 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2020-05-20 09:39:49 +0200 |
commit | 4a88caf21a0a85129f6c985ca13ba3eb54ff5366 (patch) | |
tree | c76fd0b16bd0bf84e405c298ce7617b1e357d8d6 /gcc | |
parent | dfa4fcdba374ed44d4aa1a22b2738f3f5c5b37af (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c/c-fold.c | 1 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr95141.c | 8 |
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" } */ +} |