aboutsummaryrefslogtreecommitdiff
path: root/gcc/c-decl.c
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2000-07-26 03:50:56 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2000-07-26 03:50:56 +0000
commit736f85c700aaa9ed3d9fd2f1d3ace131aaef12b3 (patch)
tree0f4eaa5bca3fe47755cb48e5e41885c12e4ec465 /gcc/c-decl.c
parent54ffbc76a662a4c00d2936655fdd505a22337bb7 (diff)
downloadgcc-736f85c700aaa9ed3d9fd2f1d3ace131aaef12b3.zip
gcc-736f85c700aaa9ed3d9fd2f1d3ace131aaef12b3.tar.gz
gcc-736f85c700aaa9ed3d9fd2f1d3ace131aaef12b3.tar.bz2
c-decl.c (finish_enum): Convert enumerations that fit in an `int' to `int'.
* c-decl.c (finish_enum): Convert enumerations that fit in an `int' to `int'. (build_enumerator): In pedantic mode, cast to `int' those that don't. From-SVN: r35259
Diffstat (limited to 'gcc/c-decl.c')
-rw-r--r--gcc/c-decl.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index c2bbb95..d80e3d4 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -5562,7 +5562,7 @@ finish_enum (enumtype, values, attributes)
tree attributes;
{
register tree pair, tem;
- tree minnode = 0, maxnode = 0;
+ tree minnode = 0, maxnode = 0, enum_value_type;
int precision, unsign;
int toplevel = (global_binding_level == current_binding_level);
@@ -5603,6 +5603,11 @@ finish_enum (enumtype, values, attributes)
precision = TYPE_PRECISION (long_long_integer_type_node);
}
+ if (precision == TYPE_PRECISION (integer_type_node))
+ enum_value_type = type_for_size (precision, 0);
+ else
+ enum_value_type = enumtype;
+
TYPE_MIN_VALUE (enumtype) = minnode;
TYPE_MAX_VALUE (enumtype) = maxnode;
TYPE_PRECISION (enumtype) = precision;
@@ -5629,7 +5634,18 @@ finish_enum (enumtype, values, attributes)
DECL_ALIGN (enu) = TYPE_ALIGN (enumtype);
DECL_USER_ALIGN (enu) = TYPE_USER_ALIGN (enumtype);
DECL_MODE (enu) = TYPE_MODE (enumtype);
- DECL_INITIAL (enu) = convert (enumtype, DECL_INITIAL (enu));
+
+ /* The ISO C Standard mandates enumerators to have type int,
+ even though the underlying type of an enum type is
+ unspecified. Here we convert any enumerators that fit in
+ an int to type int, to avoid promotions to unsigned types
+ when comparing integers with enumerators that fit in the
+ int range. When -pedantic is given, build_enumerator()
+ would have already taken care of those that don't fit. */
+ if (int_fits_type_p (DECL_INITIAL (enu), enum_value_type))
+ DECL_INITIAL (enu) = convert (enum_value_type, DECL_INITIAL (enu));
+ else
+ DECL_INITIAL (enu) = convert (enumtype, DECL_INITIAL (enu));
TREE_PURPOSE (pair) = DECL_NAME (enu);
TREE_VALUE (pair) = DECL_INITIAL (enu);
@@ -5706,7 +5722,7 @@ build_enumerator (name, value)
if (pedantic && ! int_fits_type_p (value, integer_type_node))
{
pedwarn ("ANSI C restricts enumerator values to range of `int'");
- value = integer_zero_node;
+ value = convert (integer_type_node, value);
}
/* Set basis for default for next value. */