Commit 7b45322a by Jason Merrill Committed by Jason Merrill

PR c++/88690 - C++17 ICE with empty base in aggregate.

Base fields for empty bases appear in initialization order, which may not be
the same as layout order.  If they also show up in a CONSTRUCTOR in that
order, output_constructor_regular_field aborts because it understandably
doesn't want to go backwards.  I also considered making o_c_r_f more
tolerant of the case where the out-of-order field has fieldsize 0, and so no
actual data needs to be emitted, but we might as well avoid adding an
element to the CONSTRUCTOR in the first place.

	* typeck2.c (process_init_constructor_record): Skip trivial
	initialization of an empty base.

From-SVN: r269073
parent f64629aa
2019-02-20 Jason Merrill <jason@redhat.com>
PR c++/88690 - C++17 ICE with empty base in aggregate.
* typeck2.c (process_init_constructor_record): Skip trivial
initialization of an empty base.
2019-02-21 Richard Biener <rguenther@suse.de>
PR middle-end/89392
......
......@@ -1627,6 +1627,13 @@ process_init_constructor_record (tree type, tree init, int nested, int flags,
}
}
if (DECL_SIZE (field) && integer_zerop (DECL_SIZE (field))
&& !TREE_SIDE_EFFECTS (next))
/* Don't add trivial initialization of an empty base/field to the
constructor, as they might not be ordered the way the back-end
expects. */
continue;
/* If this is a bitfield, now convert to the lowered type. */
if (type != TREE_TYPE (field))
next = cp_convert_and_check (TREE_TYPE (field), next, complain);
......
// PR c++/88690
// { dg-do compile { target c++11 } }
struct A { int a = 1; };
struct B { int b = 0; };
struct C { C() = default; C (const C&) = delete; };
struct D : public B, public C {};
struct E : A { D f; } g{};
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