From d8e1f97b7ea613d9cf460f470f84525abb4e8c8b Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Mon, 7 Nov 2005 10:34:13 +0000 Subject: [PATCH] c-typeck.c (build_c_cast): Try using a shared constant... 2005-11-07 Paolo Bonzini * 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 * gcc.dg/overflow-2.c: New testcase. From-SVN: r106587 --- gcc/ChangeLog | 5 +++++ gcc/c-typeck.c | 15 +++++++++------ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/overflow-2.c | 13 +++++++++++++ 4 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/overflow-2.c 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 + + * 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 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 + + * gcc.dg/overflow-2.c: New testcase. + 2005-11-07 Jakub Jelinek 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; +} -- 2.7.4