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
+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
}
}
+ 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);
--- /dev/null
+// 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{};