aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <merrill@gnu.org>1994-10-15 00:32:58 +0000
committerJason Merrill <merrill@gnu.org>1994-10-15 00:32:58 +0000
commitcf2ac46f182c35397fca39c0dbe392fa0c6df011 (patch)
tree49f880a1dc5b69e3647d3d0c2a99574dc4f04ab4
parentfffba94c902cc169bc55e4c923ba04d42fb8d8b0 (diff)
downloadgcc-cf2ac46f182c35397fca39c0dbe392fa0c6df011.zip
gcc-cf2ac46f182c35397fca39c0dbe392fa0c6df011.tar.gz
gcc-cf2ac46f182c35397fca39c0dbe392fa0c6df011.tar.bz2
(type_promotes_to): Also promote enums to long if
appropriate. From-SVN: r8277
-rw-r--r--gcc/cp/cvt.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c
index d804ff2..7777350 100644
--- a/gcc/cp/cvt.c
+++ b/gcc/cp/cvt.c
@@ -2024,11 +2024,16 @@ type_promotes_to (type)
wider. */
else if (TREE_CODE (type) == ENUMERAL_TYPE
|| type == wchar_type_node)
- type = type_for_size
- (MAX (TYPE_PRECISION (type), TYPE_PRECISION (integer_type_node)),
- (flag_traditional
- || (TYPE_PRECISION (type) >= TYPE_PRECISION (integer_type_node)))
- && TREE_UNSIGNED (type));
+ {
+ int precision = MAX (TYPE_PRECISION (type),
+ TYPE_PRECISION (integer_type_node));
+ tree totype = type_for_size (precision, 0);
+ if (TREE_UNSIGNED (type)
+ && ! int_fits_type_p (TYPE_MAX_VALUE (type), totype))
+ type = type_for_size (precision, 1);
+ else
+ type = totype;
+ }
else if (C_PROMOTING_INTEGER_TYPE_P (type))
{
/* Traditionally, unsignedness is preserved in default promotions.