aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2008-01-16 21:51:57 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2008-01-16 21:51:57 +0000
commitbdb55eae5e08c10636c8882140b06eeee7921209 (patch)
tree31643f94d1c330d6b0c18e681ad5beb86cc4a269 /gcc
parent2e2c7ce23798d0ffd6e1302e1594cf0de8b0bbe7 (diff)
downloadgcc-bdb55eae5e08c10636c8882140b06eeee7921209.zip
gcc-bdb55eae5e08c10636c8882140b06eeee7921209.tar.gz
gcc-bdb55eae5e08c10636c8882140b06eeee7921209.tar.bz2
re PR middle-end/32628 (bogus integer overflow warning)
2008-01-16 Richard Guenther <rguenther@suse.de> 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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/fold-const.c18
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/overflow-warn-7.c8
4 files changed, 37 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9dc1e21..0aa13b5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2008-01-16 Richard Guenther <rguenther@suse.de>
+
+ 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 <ubizjak@gmail.com>
PR debug/34249
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 22350b9..ea0b43e 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 591ca64..155e98e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-01-16 Richard Guenther <rguenther@suse.de>
+
+ PR middle-end/32628
+ * gcc.dg/overflow-warn-7.c: New testcase.
+
2008-01-16 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* 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 0000000..7c0ce68
--- /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" } */
+}
+