re PR c/44828 (possible integer wrong code bug)

2010-07-06  Richard Guenther  <rguenther@suse.de>

	PR middle-end/44828
	* convert.c (convert_to_integer): Watch out for overflowing
	MULT_EXPR as well.

	* gcc.c-torture/execute/pr44828.c: New testcase.

From-SVN: r161869
This commit is contained in:
Richard Guenther 2010-07-06 13:37:58 +00:00 committed by Richard Biener
parent c5d1f05852
commit dfb8812683
4 changed files with 39 additions and 3 deletions

View File

@ -1,3 +1,9 @@
2010-07-06 Richard Guenther <rguenther@suse.de>
PR middle-end/44828
* convert.c (convert_to_integer): Watch out for overflowing
MULT_EXPR as well.
2010-07-05 Jan Hubicka <jh@suse.cz>
* lto-streamer.c (write_symbol_vec): Rename to ...

View File

@ -768,13 +768,19 @@ convert_to_integer (tree type, tree expr)
|| ex_form == LSHIFT_EXPR
/* If we have !flag_wrapv, and either ARG0 or
ARG1 is of a signed type, we have to do
PLUS_EXPR or MINUS_EXPR in an unsigned
type. Otherwise, we would introduce
PLUS_EXPR, MINUS_EXPR or MULT_EXPR in an unsigned
type in case the operation in outprec precision
could overflow. Otherwise, we would introduce
signed-overflow undefinedness. */
|| ((!TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg0))
|| !TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg1)))
&& ((TYPE_PRECISION (TREE_TYPE (arg0)) * 2u
> outprec)
|| (TYPE_PRECISION (TREE_TYPE (arg1)) * 2u
> outprec))
&& (ex_form == PLUS_EXPR
|| ex_form == MINUS_EXPR)))
|| ex_form == MINUS_EXPR
|| ex_form == MULT_EXPR)))
typex = unsigned_type_for (typex);
else
typex = signed_type_for (typex);

View File

@ -1,3 +1,8 @@
2010-07-06 Richard Guenther <rguenther@suse.de>
PR middle-end/44828
* gcc.c-torture/execute/pr44828.c: New testcase.
2010-07-06 Shujing Zhao <pearly.zhao@oracle.com>
* g++.dg/warn/noeffect2.C: Adjust expected warning.

View File

@ -0,0 +1,19 @@
extern void abort (void);
static char
foo (char si1, char si2)
{
return si1 * si2;
}
int a = 0x105F61CA;
int
main (void)
{
int b = 0x0332F5C8;
if (foo (b, a) > 0)
abort ();
return 0;
}