class.c (layout_class_type): Correct handling of unnamed bitfields wider than their...
authorMark Mitchell <mark@codesourcery.com>
Tue, 7 Jan 2003 01:33:54 +0000 (01:33 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Tue, 7 Jan 2003 01:33:54 +0000 (01:33 +0000)
* class.c (layout_class_type): Correct handling of unnamed
bitfields wider than their types.

* testsuite/g++.dg/abi/bitfield9.C: New test.

From-SVN: r60966

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/abi/bitfield9.C [new file with mode: 0644]

index 70bc9ee33de6c00be6268e37133b70e577f594c0..9522ae6f168b5c12ae59b04c29d36b08ab8f0203 100644 (file)
@@ -1,5 +1,8 @@
 2003-01-06  Mark Mitchell  <mark@codesourcery.com>
 
+       * class.c (layout_class_type): Correct handling of unnamed
+       bitfields wider than their types.
+
        PR c++/9189
        * parser.c (cp_parser): Remove default_arg_types.  Update
        documentation for unparsed_functions_queues.
index c278aa5e91b9c409284bc29d10e8d4f9ac70f9f9..9666975a09033542d1da4a664255731046d9d472 100644 (file)
@@ -4993,6 +4993,7 @@ layout_class_type (tree t, tree *virtuals_p)
     {
       tree type;
       tree padding;
+      bool was_unnamed_p = false;
 
       /* We still pass things that aren't non-static data members to
         the back-end, in case it wants to do something with them.  */
@@ -5024,7 +5025,6 @@ layout_class_type (tree t, tree *virtuals_p)
        {
          integer_type_kind itk;
          tree integer_type;
-
          /* We must allocate the bits as if suitably aligned for the
             longest integer type that fits in this many bits.  type
             of the field.  Then, we are supposed to use the left over
@@ -5053,6 +5053,17 @@ layout_class_type (tree t, tree *virtuals_p)
              padding = size_binop (MINUS_EXPR, DECL_SIZE (field),
                                    TYPE_SIZE (integer_type));
            }
+         /* An unnamed bitfield does not normally affect the
+            alignment of the containing class on a target where
+            PCC_BITFIELD_TYPE_MATTERS.  But, the C++ ABI does not
+            make any exceptions for unnamed bitfields when the
+            bitfields are longer than their types.  Therefore, we
+            temporarily give the field a name.  */
+         if (PCC_BITFIELD_TYPE_MATTERS && !DECL_NAME (field))
+           {
+             was_unnamed_p = true;
+             DECL_NAME (field) = make_anon_name ();
+           }
          DECL_SIZE (field) = TYPE_SIZE (integer_type);
          DECL_ALIGN (field) = TYPE_ALIGN (integer_type);
          DECL_USER_ALIGN (field) = TYPE_USER_ALIGN (integer_type);
@@ -5062,6 +5073,10 @@ layout_class_type (tree t, tree *virtuals_p)
 
       layout_nonempty_base_or_field (rli, field, NULL_TREE,
                                     empty_base_offsets);
+      /* If the bit-field had no name originally, remove the name
+        now.  */
+      if (was_unnamed_p)
+       DECL_NAME (field) = NULL_TREE;
 
       /* Remember the location of any empty classes in FIELD.  */
       if (abi_version_at_least (2))
index 2c8bb11ee5fb4d953a17f7f45db5b62a317caac9..8b4fce3179c0da8aa8aa65de02fd9d05427aca65 100644 (file)
@@ -1,5 +1,7 @@
 2003-01-06  Mark Mitchell  <mark@codesourcery.com>
 
+       * testsuite/g++.dg/abi/bitfield9.C: New test.
+
        PR c++/9189
        * g++.dg/parse/defarg3.C: New test.
 
diff --git a/gcc/testsuite/g++.dg/abi/bitfield9.C b/gcc/testsuite/g++.dg/abi/bitfield9.C
new file mode 100644 (file)
index 0000000..0d744c7
--- /dev/null
@@ -0,0 +1,11 @@
+// { dg-do run { target i?86-*-* } }
+// { dg-options -w }
+
+struct X {
+  char : 45;
+};
+
+int main () {
+  if (__alignof__ (X) != 4)
+    return 1;
+}