aboutsummaryrefslogtreecommitdiff
path: root/gcc/c-typeck.c
diff options
context:
space:
mode:
authorPaolo Bonzini <bonzini@gnu.org>2005-11-07 10:34:13 +0000
committerPaolo Bonzini <bonzini@gnu.org>2005-11-07 10:34:13 +0000
commita6d405c82e928d6151c48df6523cf769fee7069f (patch)
treec296ec86b416c6310ca0de88a50c61c472ffb68f /gcc/c-typeck.c
parent8b4c9543834d46d9b06df7b6b7b7c448ee0fc444 (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.c15
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));
}
}