c-decl.c (finish_enum): Revert part of 2000-01-05 change.
authorJakub Jelinek <jakub@redhat.com>
Wed, 7 Feb 2001 22:04:10 +0000 (23:04 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 7 Feb 2001 22:04:10 +0000 (23:04 +0100)
* 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
gcc/c-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/20010202-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/991209-1.c

index 25ed2930dc46cfa180adffd7ab9fe10626444f8c..f7ad29eff90328dfac3fcb405396387796bc7e50 100644 (file)
@@ -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.
index b49f786b4c01deb07d2388558c34dcde9da64847..ef5bb38f1915c62fd579de06603aeaf6362f33c4 100644 (file)
@@ -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);
index b40f2d5c627d39f1c9b4745d5a85234d26ac6712..78bae3b630584a8959f53ee24e7d005b7310ed83 100644 (file)
@@ -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 (file)
index 0000000..e4eaae0
--- /dev/null
@@ -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);
+}
index f9028c5825fee1a28b7cd5697536cdef20cd7869..b3a47285158e315de44ab4f0a1802098f39c119d 100644 (file)
@@ -1,4 +1,4 @@
-/* { dg-do compile { target i386-*-* } } */
+/* { dg-do compile { target i?86-*-* } } */
 
 int foo ()
 {