diff options
author | Paolo Bonzini <bonzini@gnu.org> | 2005-11-07 10:34:13 +0000 |
---|---|---|
committer | Paolo Bonzini <bonzini@gcc.gnu.org> | 2005-11-07 10:34:13 +0000 |
commit | d8e1f97b7ea613d9cf460f470f84525abb4e8c8b (patch) | |
tree | c296ec86b416c6310ca0de88a50c61c472ffb68f /gcc | |
parent | ab900bfa4d485263b9744e4a56ba047ac071d272 (diff) | |
download | gcc-d8e1f97b7ea613d9cf460f470f84525abb4e8c8b.zip gcc-d8e1f97b7ea613d9cf460f470f84525abb4e8c8b.tar.gz gcc-d8e1f97b7ea613d9cf460f470f84525abb4e8c8b.tar.bz2 |
c-typeck.c (build_c_cast): Try using a shared constant...
2005-11-07 Paolo Bonzini <bonzini@gnu.org>
* c-typeck.c (build_c_cast): Try using a shared constant, and see
if TREE_OVERFLOW or TREE_CONSTANT_OVERFLOW really changed.
testsuite:
2005-11-07 Paolo Bonzini <bonzini@gnu.org>
* gcc.dg/overflow-2.c: New testcase.
From-SVN: r106587
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/c-typeck.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/overflow-2.c | 13 |
4 files changed, 31 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fb37811..17d02b2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2005-11-07 Paolo Bonzini <bonzini@gnu.org> + + * c-typeck.c (build_c_cast): Try using a shared constant, and see + if TREE_OVERFLOW or TREE_CONSTANT_OVERFLOW really changed. + 2005-11-07 Jakub Jelinek <jakub@redhat.com> PR rtl-optimization/23567 diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index d322615..80259cc8 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -3500,16 +3500,19 @@ build_c_cast (tree type, tree expr) /* Ignore any integer overflow caused by the cast. */ if (TREE_CODE (value) == INTEGER_CST) { - /* If OVALUE had overflow set, then so will VALUE, so it - is safe to overwrite. */ - if (CONSTANT_CLASS_P (ovalue)) + if (CONSTANT_CLASS_P (ovalue) + && (TREE_OVERFLOW (ovalue) || TREE_CONSTANT_OVERFLOW (ovalue))) { + /* Avoid clobbering a shared constant. */ + value = copy_node (value); TREE_OVERFLOW (value) = TREE_OVERFLOW (ovalue); - /* Similarly, constant_overflow cannot have become cleared. */ TREE_CONSTANT_OVERFLOW (value) = TREE_CONSTANT_OVERFLOW (ovalue); } - else - TREE_OVERFLOW (value) = 0; + else if (TREE_OVERFLOW (value) || TREE_CONSTANT_OVERFLOW (value)) + /* Reset VALUE's overflow flags, ensuring constant sharing. */ + value = build_int_cst_wide (TREE_TYPE (value), + TREE_INT_CST_LOW (value), + TREE_INT_CST_HIGH (value)); } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0ab2539..befbe80 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2005-11-07 Paolo Bonzini <bonzini@gnu.org> + + * gcc.dg/overflow-2.c: New testcase. + 2005-11-07 Jakub Jelinek <jakub@redhat.com> PR rtl-optimization/23567 diff --git a/gcc/testsuite/gcc.dg/overflow-2.c b/gcc/testsuite/gcc.dg/overflow-2.c new file mode 100644 index 0000000..23c22a6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/overflow-2.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-std=c99 -pedantic-errors" } */ + +/* PR c/24599 */ + +int +main (void) +{ + if ((_Bool)(__INT_MAX__ + 1)) /* { dg-warning "overflow in expression" } */ + return 1; + else + return 0; +} |