diff options
author | Paolo Bonzini <bonzini@gnu.org> | 2005-11-07 10:34:13 +0000 |
---|---|---|
committer | Paolo Bonzini <bonzini@gnu.org> | 2005-11-07 10:34:13 +0000 |
commit | a6d405c82e928d6151c48df6523cf769fee7069f (patch) | |
tree | c296ec86b416c6310ca0de88a50c61c472ffb68f /gcc/c-typeck.c | |
parent | 8b4c9543834d46d9b06df7b6b7b7c448ee0fc444 (diff) |
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.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@106587 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/c-typeck.c')
-rw-r--r-- | gcc/c-typeck.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index d3226154661..80259cc811d 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)); } } |