class.c (layout_class_type): Correct handling of unnamed bitfields wider than their types.

* 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
This commit is contained in:
Mark Mitchell 2003-01-07 01:33:54 +00:00 committed by Mark Mitchell
parent 52fd80fb25
commit 63e5f5679c
4 changed files with 32 additions and 1 deletions

View 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.

View 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))

View 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.

View File

@ -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;
}