re PR c++/10179 (alignment attributes are not inherited correctly with empty classes)

PR c++/10179
        * class.c (layout_empty_base): Take rli parameter, update
        rli->record_align if empty base has user-specified alignment.
        (build_base_field): Pass rli to it.

From-SVN: r128871
This commit is contained in:
Jason Merrill 2007-09-28 14:07:57 -04:00 committed by Jason Merrill
parent 930a1e6372
commit d9d9dbc0d0
3 changed files with 35 additions and 3 deletions

View File

@ -1,3 +1,10 @@
2007-09-28 Jason Merrill <jason@redhat.com>
PR c++/10179
* class.c (layout_empty_base): Take rli parameter, update
rli->record_align if empty base has user-specified alignment.
(build_base_field): Pass rli to it.
2007-09-28 Paolo Carlini <pcarlini@suse.de> 2007-09-28 Paolo Carlini <pcarlini@suse.de>
PR c++/33213 PR c++/33213
@ -26,6 +33,7 @@
2007-09-27 Jason Merrill <jason@redhat.com> 2007-09-27 Jason Merrill <jason@redhat.com>
PR c++/33571
* decl2.c (is_late_template_attribute): Don't crash on unknown * decl2.c (is_late_template_attribute): Don't crash on unknown
attribute. attribute.

View File

@ -179,7 +179,7 @@ static void initialize_vtable (tree, tree);
static void layout_nonempty_base_or_field (record_layout_info, static void layout_nonempty_base_or_field (record_layout_info,
tree, tree, splay_tree); tree, tree, splay_tree);
static tree end_of_class (tree, int); static tree end_of_class (tree, int);
static bool layout_empty_base (tree, tree, splay_tree); static bool layout_empty_base (record_layout_info, tree, tree, splay_tree);
static void accumulate_vtbl_inits (tree, tree, tree, tree, tree); static void accumulate_vtbl_inits (tree, tree, tree, tree, tree);
static tree dfs_accumulate_vtbl_inits (tree, tree, tree, tree, static tree dfs_accumulate_vtbl_inits (tree, tree, tree, tree,
tree); tree);
@ -3517,7 +3517,8 @@ empty_base_at_nonzero_offset_p (tree type,
type. Return nonzero iff we added it at the end. */ type. Return nonzero iff we added it at the end. */
static bool static bool
layout_empty_base (tree binfo, tree eoc, splay_tree offsets) layout_empty_base (record_layout_info rli, tree binfo,
tree eoc, splay_tree offsets)
{ {
tree alignment; tree alignment;
tree basetype = BINFO_TYPE (binfo); tree basetype = BINFO_TYPE (binfo);
@ -3563,6 +3564,15 @@ layout_empty_base (tree binfo, tree eoc, splay_tree offsets)
propagate_binfo_offsets (binfo, alignment); propagate_binfo_offsets (binfo, alignment);
} }
} }
if (CLASSTYPE_USER_ALIGN (basetype))
{
rli->record_align = MAX (rli->record_align, CLASSTYPE_ALIGN (basetype));
if (warn_packed)
rli->unpacked_align = MAX (rli->unpacked_align, CLASSTYPE_ALIGN (basetype));
TYPE_USER_ALIGN (rli->t) = 1;
}
return atend; return atend;
} }
@ -3626,7 +3636,7 @@ build_base_field (record_layout_info rli, tree binfo,
byte-aligned. */ byte-aligned. */
eoc = round_up (rli_size_unit_so_far (rli), eoc = round_up (rli_size_unit_so_far (rli),
CLASSTYPE_ALIGN_UNIT (basetype)); CLASSTYPE_ALIGN_UNIT (basetype));
atend = layout_empty_base (binfo, eoc, offsets); atend = layout_empty_base (rli, binfo, eoc, offsets);
/* A nearly-empty class "has no proper base class that is empty, /* A nearly-empty class "has no proper base class that is empty,
not morally virtual, and at an offset other than zero." */ not morally virtual, and at an offset other than zero." */
if (!BINFO_VIRTUAL_P (binfo) && CLASSTYPE_NEARLY_EMPTY_P (t)) if (!BINFO_VIRTUAL_P (binfo) && CLASSTYPE_NEARLY_EMPTY_P (t))

View File

@ -0,0 +1,14 @@
// PR c++/10179
struct __attribute((aligned(__alignof(double)))) A
{ /* empty */ };
struct T : public A
{
char c;
};
template<bool> struct StaticAssert;
template<> struct StaticAssert<true> {};
StaticAssert<__alignof(T) == __alignof(double)> d;