diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f123dbac0ff7944140edca209a8c8a0526534b83..afcd8bcb341272af463bef1223f58456408bddc8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c
index c29c22d81f3d177e17c1d131dc81273e396b0c81..6e128e3560d1e4b7ebbab44d6b2247a608956002 100644
--- a/gcc/stor-layout.c
+++ b/gcc/stor-layout.c
@@ -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)