(finish_struct): Promote unsigned bitfield to signed int
authorRichard Stallman <rms@gnu.org>
Sun, 18 Apr 1993 03:35:35 +0000 (03:35 +0000)
committerRichard Stallman <rms@gnu.org>
Sun, 18 Apr 1993 03:35:35 +0000 (03:35 +0000)
if the field isn't as wide as an int.

From-SVN: r4178

gcc/c-decl.c

index fefce7211bbb802a840b5cb537fdb4b021c5a646..9efece4d7705d18d5bab15def570472f5438df9c 100644 (file)
@@ -5260,19 +5260,23 @@ finish_struct (t, fieldlist)
   /* Promote each bit-field's type to int if it is narrower than that.  */
   for (x = fieldlist; x; x = TREE_CHAIN (x))
     if (DECL_BIT_FIELD (x)
-       && C_PROMOTING_INTEGER_TYPE_P (TREE_TYPE (x)))
-    {
-      tree type = TREE_TYPE (x);
-
-      /* Preserve unsignedness if traditional or if not really any wider.  */
-      if (TREE_UNSIGNED (type)
-         && (flag_traditional
-             || (TYPE_PRECISION (type)
-                 == TYPE_PRECISION (integer_type_node))))
-       TREE_TYPE (x) = unsigned_type_node;
-      else
-       TREE_TYPE (x) = integer_type_node;
-    }
+       && (C_PROMOTING_INTEGER_TYPE_P (TREE_TYPE (x))
+           || DECL_FIELD_SIZE (x) < TYPE_PRECISION (integer_type_node)))
+      {
+       tree type = TREE_TYPE (x);
+
+       /* Preserve unsignedness if traditional
+          or if not really getting any wider.  */
+       if (TREE_UNSIGNED (type)
+           && (flag_traditional
+               ||
+               (TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node)
+                &&
+                DECL_FIELD_SIZE (x) == TYPE_PRECISION (integer_type_node))))
+         TREE_TYPE (x) = unsigned_type_node;
+       else
+         TREE_TYPE (x) = integer_type_node;
+      }
 
   /* If this structure or union completes the type of any previous
      variable declaration, lay it out and output its rtl.  */