aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>1997-08-02 22:50:39 +0000
committerkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>1997-08-02 22:50:39 +0000
commiteb4221f459f8f2ba2c0f6dfde52c5b928964bb1c (patch)
treea70c18d2e75c8534b2bf138f1c9295a458f59432 /gcc
parent38e911c3e2d0a9bf747575cd8e2a95cf48d9f415 (diff)
(int_fits_type_p): Negative ints never fit unsigned types, and
unsigned ints with top-bit-set never fit signed types. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@14637 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/tree.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/gcc/tree.c b/gcc/tree.c
index f756d05faa7..658c05f8684 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -4346,12 +4346,18 @@ int_fits_type_p (c, type)
return (! (TREE_CODE (TYPE_MAX_VALUE (type)) == INTEGER_CST
&& INT_CST_LT_UNSIGNED (TYPE_MAX_VALUE (type), c))
&& ! (TREE_CODE (TYPE_MIN_VALUE (type)) == INTEGER_CST
- && INT_CST_LT_UNSIGNED (c, TYPE_MIN_VALUE (type))));
+ && INT_CST_LT_UNSIGNED (c, TYPE_MIN_VALUE (type)))
+ /* Negative ints never fit unsigned types. */
+ && ! (TREE_INT_CST_HIGH (c) < 0
+ && ! TREE_UNSIGNED (TREE_TYPE (c))));
else
return (! (TREE_CODE (TYPE_MAX_VALUE (type)) == INTEGER_CST
&& INT_CST_LT (TYPE_MAX_VALUE (type), c))
&& ! (TREE_CODE (TYPE_MIN_VALUE (type)) == INTEGER_CST
- && INT_CST_LT (c, TYPE_MIN_VALUE (type))));
+ && INT_CST_LT (c, TYPE_MIN_VALUE (type)))
+ /* Unsigned ints with top bit set never fit signed types. */
+ && ! (TREE_INT_CST_HIGH (c) < 0
+ && TREE_UNSIGNED (TREE_TYPE (c))));
}
/* Return the innermost context enclosing DECL that is