From 63e5f5679cf5daf7c27ca1c9a585cef733f857ce Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Tue, 7 Jan 2003 01:33:54 +0000 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/class.c | 17 ++++++++++++++++- gcc/testsuite/ChangeLog | 2 ++ gcc/testsuite/g++.dg/abi/bitfield9.C | 11 +++++++++++ 4 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/abi/bitfield9.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 70bc9ee33de6..9522ae6f168b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2003-01-06 Mark Mitchell + * 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. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index c278aa5e91b9..9666975a0903 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -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)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2c8bb11ee5fb..8b4fce3179c0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2003-01-06 Mark Mitchell + * 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 index 000000000000..0d744c7318f6 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/bitfield9.C @@ -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; +}