Commit c0572427 by Mark Mitchell Committed by Mark Mitchell

class.c (record_subobject_offsets): Don't record offsets past biggest empty…

class.c (record_subobject_offsets): Don't record offsets past biggest empty class for non-empty base classes.

	* class.c (record_subobject_offsets): Don't record offsets past
	biggest empty class for non-empty base classes.
	(layout_class_type): Use TYPE_SIZE_UNIT, not TYPE_SIZE, when
	keeping track of the size of emptyclasses.

From-SVN: r106580
parent 405a3684
2005-11-06 Mark Mitchell <mark@codesourcery.com> 2005-11-06 Mark Mitchell <mark@codesourcery.com>
* class.c (record_subobject_offsets): Don't record offsets past
biggest empty class for non-empty base classes.
(layout_class_type): Use TYPE_SIZE_UNIT, not TYPE_SIZE, when
keeping track of the size of emptyclasses.
PR c++/21308 PR c++/21308
* class.c (sizeof_biggest_empty_class): New variable. * class.c (sizeof_biggest_empty_class): New variable.
(record_subobject_offsets): Don't record offsets past biggest (record_subobject_offsets): Don't record offsets past biggest
......
...@@ -3286,8 +3286,8 @@ walk_subobject_offsets (tree type, ...@@ -3286,8 +3286,8 @@ walk_subobject_offsets (tree type,
return 0; return 0;
} }
/* Record all of the empty subobjects of TYPE (located at OFFSET) in /* Record all of the empty subobjects of TYPE (either a type or a
OFFSETS. If IS_DATA_MEMBER is true, then a non-static data member binfo). If IS_DATA_MEMBER is true, then a non-static data member
is being placed at OFFSET; otherwise, it is a base class that is is being placed at OFFSET; otherwise, it is a base class that is
being placed at OFFSET. */ being placed at OFFSET. */
...@@ -3298,19 +3298,21 @@ record_subobject_offsets (tree type, ...@@ -3298,19 +3298,21 @@ record_subobject_offsets (tree type,
bool is_data_member) bool is_data_member)
{ {
tree max_offset; tree max_offset;
/* If recording subobjects for a non-static data member, do not need /* If recording subobjects for a non-static data member or a
to record offsets beyond the size of the biggest empty class. non-empty base class , we do not need to record offsets beyond
Additional data members will go at the end of the class. the size of the biggest empty class. Additional data members
Additional base classes will go either at offset zero (if empty, will go at the end of the class. Additional base classes will go
in which case they cannot overlap with offsets past the size of either at offset zero (if empty, in which case they cannot
the biggest empty class) or at the end of the class. overlap with offsets past the size of the biggest empty class) or
at the end of the class.
However, if we are placing an empty class, then we must record
However, if we are placing an empty base class, then we must record
all offsets, as either the empty class is at offset zero (where all offsets, as either the empty class is at offset zero (where
other empty classes might later be placed) or at the end of the other empty classes might later be placed) or at the end of the
class (where other objects might then be placed, so other empty class (where other objects might then be placed, so other empty
subobjects might later overlap). */ subobjects might later overlap). */
if (is_data_member) if (is_data_member
|| !is_empty_class (BINFO_TYPE (type)))
max_offset = sizeof_biggest_empty_class; max_offset = sizeof_biggest_empty_class;
else else
max_offset = NULL_TREE; max_offset = NULL_TREE;
...@@ -4850,8 +4852,9 @@ layout_class_type (tree t, tree *virtuals_p) ...@@ -4850,8 +4852,9 @@ layout_class_type (tree t, tree *virtuals_p)
splay_tree_delete (empty_base_offsets); splay_tree_delete (empty_base_offsets);
if (CLASSTYPE_EMPTY_P (t) if (CLASSTYPE_EMPTY_P (t)
&& tree_int_cst_lt (sizeof_biggest_empty_class, TYPE_SIZE (t))) && tree_int_cst_lt (sizeof_biggest_empty_class,
sizeof_biggest_empty_class = TYPE_SIZE (t); TYPE_SIZE_UNIT (t)))
sizeof_biggest_empty_class = TYPE_SIZE_UNIT (t);
} }
/* Determine the "key method" for the class type indicated by TYPE, /* Determine the "key method" for the class type indicated by TYPE,
......
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