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:
parent
930a1e6372
commit
d9d9dbc0d0
@ -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.
|
||||||
|
|
||||||
|
@ -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))
|
||||||
|
14
gcc/testsuite/g++.dg/ext/align2.C
Normal file
14
gcc/testsuite/g++.dg/ext/align2.C
Normal 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;
|
Loading…
Reference in New Issue
Block a user