Commit 555456b1 by Mark Mitchell Committed by Mark Mitchell

re PR c++/10549 (ICE in store_bit_field on bitfields that exceed the precision…

re PR c++/10549 (ICE in store_bit_field on bitfields that exceed the precision of the declared type.)

	PR c++/10549
	* class.c (layout_class_type): Mark overlong bitfields as having
	the maximum size permitted by their type, after layout.

	PR c++/10549
	* g++.dg/other/bitfield1.C: New test.

From-SVN: r66257
parent f4ddb75b
2003-04-29 Mark Mitchell <mark@codesourcery.com> 2003-04-29 Mark Mitchell <mark@codesourcery.com>
PR c++/10549
* class.c (layout_class_type): Mark overlong bitfields as having
the maximum size permitted by their type, after layout.
PR c++/10527 PR c++/10527
* error.c (dump_expr): Correctly handling of NEW_EXPR.4 * error.c (dump_expr): Correctly handling of NEW_EXPR.4
......
...@@ -4724,7 +4724,6 @@ layout_class_type (tree t, tree *virtuals_p) ...@@ -4724,7 +4724,6 @@ layout_class_type (tree t, tree *virtuals_p)
{ {
tree type; tree type;
tree padding; tree padding;
bool was_unnamed_p = false;
/* We still pass things that aren't non-static data members to /* We still pass things that aren't non-static data members to
the back-end, in case it wants to do something with them. */ the back-end, in case it wants to do something with them. */
...@@ -4758,6 +4757,7 @@ layout_class_type (tree t, tree *virtuals_p) ...@@ -4758,6 +4757,7 @@ layout_class_type (tree t, tree *virtuals_p)
{ {
integer_type_kind itk; integer_type_kind itk;
tree integer_type; tree integer_type;
bool was_unnamed_p = false;
/* We must allocate the bits as if suitably aligned for the /* We must allocate the bits as if suitably aligned for the
longest integer type that fits in this many bits. type longest integer type that fits in this many bits. type
of the field. Then, we are supposed to use the left over of the field. Then, we are supposed to use the left over
...@@ -4809,14 +4809,18 @@ layout_class_type (tree t, tree *virtuals_p) ...@@ -4809,14 +4809,18 @@ layout_class_type (tree t, tree *virtuals_p)
DECL_SIZE (field) = TYPE_SIZE (integer_type); DECL_SIZE (field) = TYPE_SIZE (integer_type);
DECL_ALIGN (field) = TYPE_ALIGN (integer_type); DECL_ALIGN (field) = TYPE_ALIGN (integer_type);
DECL_USER_ALIGN (field) = TYPE_USER_ALIGN (integer_type); DECL_USER_ALIGN (field) = TYPE_USER_ALIGN (integer_type);
layout_nonempty_base_or_field (rli, field, NULL_TREE,
empty_base_offsets);
if (was_unnamed_p)
DECL_NAME (field) = NULL_TREE;
/* Now that layout has been performed, set the size of the
field to the size of its declared type; the rest of the
field is effectively invisible. */
DECL_SIZE (field) = TYPE_SIZE (type);
} }
else
layout_nonempty_base_or_field (rli, field, NULL_TREE, layout_nonempty_base_or_field (rli, field, NULL_TREE,
empty_base_offsets); 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. */ /* Remember the location of any empty classes in FIELD. */
if (abi_version_at_least (2)) if (abi_version_at_least (2))
......
2003-04-29 Mark Mitchell <mark@codesourcery.com> 2003-04-29 Mark Mitchell <mark@codesourcery.com>
PR c++/10549
* g++.dg/other/bitfield1.C: New test.
PR c++/10527 PR c++/10527
* g++.dg/init/new7.C: New test. * g++.dg/init/new7.C: New test.
......
// { dg-options "-w" }
union u1 {
char m1 : 16;
} x;
int main () {
x.m1 = 256;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment