Commit a8c1d899 by Jason Merrill Committed by Jason Merrill

re PR c++/51331 (bad code generated when explicitly calling auto-generated…

re PR c++/51331 (bad code generated when explicitly calling auto-generated constructor of virtual base)

	PR c++/51331
	* class.c (convert_to_base_statically): Just call
	build_simple_base_path.
	(build_simple_base_path): Check field offset.

From-SVN: r182414
parent 20fb2c13
2011-12-16 Jason Merrill <jason@redhat.com>
PR c++/51331
* class.c (convert_to_base_statically): Just call
build_simple_base_path.
(build_simple_base_path): Check field offset.
2011-12-15 Jason Merrill <jason@redhat.com>
PR c++/51458
......
......@@ -471,7 +471,14 @@ build_simple_base_path (tree expr, tree binfo)
/* Is this the base field created by build_base_field? */
if (TREE_CODE (field) == FIELD_DECL
&& DECL_FIELD_IS_BASE (field)
&& TREE_TYPE (field) == type)
&& TREE_TYPE (field) == type
/* If we're looking for a field in the most-derived class,
also check the field offset; we can have two base fields
of the same type if one is an indirect virtual base and one
is a direct non-virtual base. */
&& (BINFO_INHERITANCE_CHAIN (d_binfo)
|| tree_int_cst_equal (byte_position (field),
BINFO_OFFSET (binfo))))
{
/* We don't use build_class_member_access_expr here, as that
has unnecessary checks, and more importantly results in
......@@ -546,6 +553,10 @@ convert_to_base_statically (tree expr, tree base)
expr_type = TREE_TYPE (expr);
if (!SAME_BINFO_TYPE_P (BINFO_TYPE (base), expr_type))
{
/* If this is a non-empty base, use a COMPONENT_REF. */
if (!is_empty_class (BINFO_TYPE (base)))
return build_simple_base_path (expr, base);
/* We use fold_build2 and fold_convert below to simplify the trees
provided to the optimizers. It is not safe to call these functions
when processing a template because they do not handle C++-specific
......
......@@ -140,7 +140,9 @@ initialize_vtbl_ptrs (tree addr)
zero-initialization does not simply mean filling the storage with
zero bytes. FIELD_SIZE, if non-NULL, is the bit size of the field,
subfields with bit positions at or above that bit size shouldn't
be added. */
be added. Note that this only works when the result is assigned
to a base COMPONENT_REF; if we only have a pointer to the base subobject,
expand_assignment will end up clearing the full size of TYPE. */
static tree
build_zero_init_1 (tree type, tree nelts, bool static_storage_p,
......
2011-12-16 Jason Merrill <jason@redhat.com>
PR c++/51331
* g++.dg/init/value10.C: New.
2011-12-16 Jakub Jelinek <jakub@redhat.com>
PR testsuite/50803
......
// PR c++/51331
// { dg-do run }
struct A {
A(): x(10) {}
virtual ~A() {}
int x;
};
struct B: public virtual A {
};
struct C: public virtual A {
};
struct D: public B, virtual public C {
D(): B(), C() {} // note an explicit call to C() which is auto-generated
};
int main() {
D* d = new D();
// Crashes here with the following message:
// *** glibc detected *** ./test: free(): invalid next size (fast)
delete d;
}
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