From: Jakub Jelinek Date: Wed, 7 Feb 2001 22:04:10 +0000 (+0100) Subject: c-decl.c (finish_enum): Revert part of 2000-01-05 change. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=1ada4cd0940926190d1f0ee1264e19883547c1b4;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 25ed2930dc4..f7ad29eff90 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2001-02-07 Jakub Jelinek + + * c-decl.c (finish_enum): Revert part of 2000-01-05 change. + 2001-02-07 Mark Mitchell * config/rs6000/aix43.h (CPLUSCPLUS_CPP_SPEC): Define it. diff --git a/gcc/c-decl.c b/gcc/c-decl.c index b49f786b4c0..ef5bb38f191 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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b40f2d5c627..78bae3b6305 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2001-02-07 Jakub Jelinek + + * gcc.dg/20010202-1.c: New test. + * gcc.dg/991209-1.c: Compile on whole ia32 family, not just i386. + 2001-02-07 Zack Weinberg * g++.dg/stdbool-if.C: New test. diff --git a/gcc/testsuite/gcc.dg/20010202-1.c b/gcc/testsuite/gcc.dg/20010202-1.c new file mode 100644 index 00000000000..e4eaae0b246 --- /dev/null +++ b/gcc/testsuite/gcc.dg/20010202-1.c @@ -0,0 +1,24 @@ +/* { dg-do compile { target i?86-*-* sparc*-*-* } } */ +/* { dg-options "-O2" } */ + +typedef enum { false, true } __attribute__ ((packed)) boolean; +typedef struct { + enum { + A0 = 0, A1 = 1, A2 = 2 + } __attribute__((packed)) A:3; + enum { + B0 = 0, B1 = 1, B2 = 2 + } __attribute__((packed)) B:3; + boolean C:1; + boolean D:1; + unsigned char :8; +} foo; +foo x = { A2, B1, false, true }; + +int main(void) +{ + if (sizeof (foo) != 2 || __alignof__ (foo) != 1) + abort (); + + exit (0); +} diff --git a/gcc/testsuite/gcc.dg/991209-1.c b/gcc/testsuite/gcc.dg/991209-1.c index f9028c5825f..b3a47285158 100644 --- a/gcc/testsuite/gcc.dg/991209-1.c +++ b/gcc/testsuite/gcc.dg/991209-1.c @@ -1,4 +1,4 @@ -/* { dg-do compile { target i386-*-* } } */ +/* { dg-do compile { target i?86-*-* } } */ int foo () {