* stor-layout.c (layout_decl): Do packed field alignment for
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 22 Oct 2003 02:14:36 +0000 (02:14 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 22 Oct 2003 02:14:36 +0000 (02:14 +0000)
        bit-fields, too.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@72786 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/stor-layout.c

index f123dba..afcd8bc 100644 (file)
@@ -1,3 +1,8 @@
+2003-10-21  Jason Merrill  <jason@redhat.com>
+
+       * stor-layout.c (layout_decl): Do packed field alignment for
+       bit-fields, too.
+
 2003-10-21  Eric Christopher  <echristo@redhat.com>
 
        * expr.c (convert_move): Use FLOAT_EXTEND for extensions.
index c29c22d..6e128e3 100644 (file)
@@ -397,6 +397,8 @@ layout_decl (tree decl, unsigned int known_align)
   else
     /* For fields, it's a bit more complicated...  */
     {
+      bool old_user_align = DECL_USER_ALIGN (decl);
+
       if (DECL_BIT_FIELD (decl))
        {
          DECL_BIT_FIELD_TYPE (decl) = type;
@@ -454,22 +456,21 @@ layout_decl (tree decl, unsigned int known_align)
           supercede USER_ALIGN inherited from the type, but defer to
           alignment explicitly specified on the field decl.  */;
       else
-       {
-         do_type_align (type, decl);
-
-         /* If the field is of variable size, we can't misalign it since we
-            have no way to make a temporary to align the result.  But this
-            isn't an issue if the decl is not addressable.  Likewise if it
-            is of unknown size.
-
-            Note that do_type_align may set DECL_USER_ALIGN, so we don't
-            want to check it again here.  */
-         if (DECL_PACKED (decl)
-             && (DECL_NONADDRESSABLE_P (decl)
-                 || DECL_SIZE_UNIT (decl) == 0
-                 || TREE_CODE (DECL_SIZE_UNIT (decl)) == INTEGER_CST))
-           DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), BITS_PER_UNIT);
-       }
+       do_type_align (type, decl);
+
+      /* If the field is of variable size, we can't misalign it since we
+        have no way to make a temporary to align the result.  But this
+        isn't an issue if the decl is not addressable.  Likewise if it
+        is of unknown size.
+
+        Note that do_type_align may set DECL_USER_ALIGN, so we need to
+        check old_user_align instead.  */
+      if (DECL_PACKED (decl)
+         && !old_user_align
+         && (DECL_NONADDRESSABLE_P (decl)
+             || DECL_SIZE_UNIT (decl) == 0
+             || TREE_CODE (DECL_SIZE_UNIT (decl)) == INTEGER_CST))
+       DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), BITS_PER_UNIT);
 
       /* Should this be controlled by DECL_USER_ALIGN, too?  */
       if (maximum_field_alignment != 0)