diff options
author | Jakub Jelinek <jakub@redhat.com> | 2001-02-07 23:04:10 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2001-02-07 23:04:10 +0100 |
commit | 1ada4cd0940926190d1f0ee1264e19883547c1b4 (patch) | |
tree | f9dbb0d3520859fd2b4ba6efc1d1401d1ac5b421 /gcc/c-decl.c | |
parent | 0c952af328e6048ddbc5087225197b4851a57f5e (diff) | |
download | gcc-1ada4cd0940926190d1f0ee1264e19883547c1b4.zip gcc-1ada4cd0940926190d1f0ee1264e19883547c1b4.tar.gz gcc-1ada4cd0940926190d1f0ee1264e19883547c1b4.tar.bz2 |
c-decl.c (finish_enum): Revert part of 2000-01-05 change.
* c-decl.c (finish_enum): Revert part of 2000-01-05 change.
* gcc.dg/20010202-1.c: New test.
* gcc.dg/991209-1.c: Compile on whole ia32 family, not just i386.
From-SVN: r39527
Diffstat (limited to 'gcc/c-decl.c')
-rw-r--r-- | gcc/c-decl.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/gcc/c-decl.c b/gcc/c-decl.c index b49f786..ef5bb38 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -5610,13 +5610,19 @@ finish_enum (enumtype, values, attributes) unsign = (tree_int_cst_sgn (minnode) >= 0); precision = MAX (min_precision (minnode, unsign), min_precision (maxnode, unsign)); - if (!TYPE_PACKED (enumtype)) - precision = MAX (precision, TYPE_PRECISION (integer_type_node)); - if (type_for_size (precision, unsign) == 0) + if (TYPE_PACKED (enumtype) || precision > TYPE_PRECISION (integer_type_node)) { - warning ("enumeration values exceed range of largest integer"); - precision = TYPE_PRECISION (long_long_integer_type_node); + tree narrowest = type_for_size (precision, unsign); + if (narrowest == 0) + { + warning ("enumeration values exceed range of largest integer"); + narrowest = long_long_integer_type_node; + } + + precision = TYPE_PRECISION (narrowest); } + else + precision = TYPE_PRECISION (integer_type_node); if (precision == TYPE_PRECISION (integer_type_node)) enum_value_type = type_for_size (precision, 0); |