From: Richard Guenther Date: Wed, 16 Jan 2008 21:51:57 +0000 (+0000) Subject: re PR middle-end/32628 (bogus integer overflow warning) X-Git-Tag: releases/gcc-4.3.0~583 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bdb55eae5e08c10636c8882140b06eeee7921209;p=thirdparty%2Fgcc.git re PR middle-end/32628 (bogus integer overflow warning) 2008-01-16 Richard Guenther PR middle-end/32628 * fold-const.c (fold_convert_const_int_from_int): Do not set overflow if that occured only because of a sign extension change when converting from/to a sizetype with the same precision and signedness. * gcc.dg/overflow-warn-7.c: New testcase. From-SVN: r131579 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9dc1e213afd7..0aa13b5c526f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2008-01-16 Richard Guenther + + PR middle-end/32628 + * fold-const.c (fold_convert_const_int_from_int): Do not + set overflow if that occured only because of a sign extension + change when converting from/to a sizetype with the same + precision and signedness. + 2008-01-16 Uros Bizjak PR debug/34249 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 22350b98bf41..ea0b43e942d2 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -2122,8 +2122,22 @@ fold_convert_const_int_from_int (tree type, const_tree arg1) t = force_fit_type_double (type, TREE_INT_CST_LOW (arg1), TREE_INT_CST_HIGH (arg1), /* Don't set the overflow when - converting a pointer */ - !POINTER_TYPE_P (TREE_TYPE (arg1)), + converting from a pointer, */ + !POINTER_TYPE_P (TREE_TYPE (arg1)) + /* or to a sizetype with same signedness + and the precision is unchanged. + ??? sizetype is always sign-extended, + but its signedness depends on the + frontend. Thus we see spurious overflows + here if we do not check this. */ + && !((TYPE_PRECISION (TREE_TYPE (arg1)) + == TYPE_PRECISION (type)) + && (TYPE_UNSIGNED (TREE_TYPE (arg1)) + == TYPE_UNSIGNED (type)) + && ((TREE_CODE (TREE_TYPE (arg1)) == INTEGER_TYPE + && TYPE_IS_SIZETYPE (TREE_TYPE (arg1))) + || (TREE_CODE (type) == INTEGER_TYPE + && TYPE_IS_SIZETYPE (type)))), (TREE_INT_CST_HIGH (arg1) < 0 && (TYPE_UNSIGNED (type) < TYPE_UNSIGNED (TREE_TYPE (arg1)))) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 591ca646e928..155e98eb1c73 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-01-16 Richard Guenther + + PR middle-end/32628 + * gcc.dg/overflow-warn-7.c: New testcase. + 2008-01-16 Kaveh R. Ghazi * gcc.dg/tree-ssa/loop-19.c: Require nonpic. diff --git a/gcc/testsuite/gcc.dg/overflow-warn-7.c b/gcc/testsuite/gcc.dg/overflow-warn-7.c new file mode 100644 index 000000000000..7c0ce68df508 --- /dev/null +++ b/gcc/testsuite/gcc.dg/overflow-warn-7.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-options "-Wall" } */ + +int f(char *device) +{ + return device == ((char *)0 + ~0UL); /* { dg-bogus "overflow" } */ +} +