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:
parent
c5d1f05852
commit
dfb8812683
@ -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 ...
|
||||
|
@ -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);
|
||||
|
@ -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.
|
||||
|
19
gcc/testsuite/gcc.c-torture/execute/pr44828.c
Normal file
19
gcc/testsuite/gcc.c-torture/execute/pr44828.c
Normal 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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user