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 | |
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')
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/c-decl.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/20010202-1.c | 24 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/991209-1.c | 2 |
5 files changed, 45 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 25ed293..f7ad29e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2001-02-07 Jakub Jelinek <jakub@redhat.com> + + * c-decl.c (finish_enum): Revert part of 2000-01-05 change. + 2001-02-07 Mark Mitchell <mark@codesourcery.com> * config/rs6000/aix43.h (CPLUSCPLUS_CPP_SPEC): Define it. 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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b40f2d5..78bae3b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2001-02-07 Jakub Jelinek <jakub@redhat.com> + + * 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 <zack@wolery.stanford.edu> * 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 0000000..e4eaae0 --- /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 f9028c5..b3a4728 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 () { |