From 1ada4cd0940926190d1f0ee1264e19883547c1b4 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 7 Feb 2001 23:04:10 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 4 ++++ gcc/c-decl.c | 16 +++++++++++----- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/20010202-1.c | 24 ++++++++++++++++++++++++ gcc/testsuite/gcc.dg/991209-1.c | 2 +- 5 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/20010202-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 25ed2930dc46..f7ad29eff903 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 b49f786b4c01..ef5bb38f1915 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 b40f2d5c627d..78bae3b63058 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 000000000000..e4eaae0b246d --- /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 f9028c5825fe..b3a47285158e 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 () { -- 2.43.5