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.
This commit is contained in:
Richard Biener 2020-05-19 07:58:33 +02:00
parent dfa4fcdba3
commit 4a88caf21a
4 changed files with 20 additions and 0 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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" } */
}