mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-19 12:21:15 +08:00
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
This commit is contained in:
parent
405a3684f5
commit
c0572427ed
@ -1,5 +1,10 @@
|
||||
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
|
||||
* class.c (sizeof_biggest_empty_class): New variable.
|
||||
(record_subobject_offsets): Don't record offsets past biggest
|
||||
|
@ -3286,8 +3286,8 @@ walk_subobject_offsets (tree type,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Record all of the empty subobjects of TYPE (located at OFFSET) in
|
||||
OFFSETS. If IS_DATA_MEMBER is true, then a non-static data member
|
||||
/* Record all of the empty subobjects of TYPE (either a type or a
|
||||
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
|
||||
being placed at OFFSET. */
|
||||
|
||||
@ -3298,19 +3298,21 @@ record_subobject_offsets (tree type,
|
||||
bool is_data_member)
|
||||
{
|
||||
tree max_offset;
|
||||
/* If recording subobjects for a non-static data member, do not need
|
||||
to record offsets beyond the size of the biggest empty class.
|
||||
Additional data members will go at the end of the class.
|
||||
Additional base classes will go either at offset zero (if empty,
|
||||
in which case they cannot overlap with offsets past the size of
|
||||
the biggest empty class) or at the end of the class.
|
||||
/* If recording subobjects for a non-static data member or a
|
||||
non-empty base class , we do not need to record offsets beyond
|
||||
the size of the biggest empty class. Additional data members
|
||||
will go at the end of the class. Additional base classes will go
|
||||
either at offset zero (if empty, in which case they cannot
|
||||
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
|
||||
other empty classes might later be placed) or at the end of the
|
||||
class (where other objects might then be placed, so other empty
|
||||
subobjects might later overlap). */
|
||||
if (is_data_member)
|
||||
if (is_data_member
|
||||
|| !is_empty_class (BINFO_TYPE (type)))
|
||||
max_offset = sizeof_biggest_empty_class;
|
||||
else
|
||||
max_offset = NULL_TREE;
|
||||
@ -4850,8 +4852,9 @@ layout_class_type (tree t, tree *virtuals_p)
|
||||
splay_tree_delete (empty_base_offsets);
|
||||
|
||||
if (CLASSTYPE_EMPTY_P (t)
|
||||
&& tree_int_cst_lt (sizeof_biggest_empty_class, TYPE_SIZE (t)))
|
||||
sizeof_biggest_empty_class = TYPE_SIZE (t);
|
||||
&& tree_int_cst_lt (sizeof_biggest_empty_class,
|
||||
TYPE_SIZE_UNIT (t)))
|
||||
sizeof_biggest_empty_class = TYPE_SIZE_UNIT (t);
|
||||
}
|
||||
|
||||
/* Determine the "key method" for the class type indicated by TYPE,
|
||||
|
Loading…
x
Reference in New Issue
Block a user