output_constructor doesn't like two consecutive entries with fields at the
same position; let's avoid adding the one for the empty field.
gcc/cp/ChangeLog
2020-03-04 Jason Merrill <jason@redhat.com>
PR c++/90432
* init.c (perform_member_init): Don't do aggregate initialization of
empty field.
* constexpr.c (cx_check_missing_mem_inits): Don't enforce
initialization of empty field.
+2020-03-04 Jason Merrill <jason@redhat.com>
+
+ PR c++/90432
+ * init.c (perform_member_init): Don't do aggregate initialization of
+ empty field.
+ * constexpr.c (cx_check_missing_mem_inits): Don't enforce
+ initialization of empty field.
+
2020-03-04 Jason Merrill <jason@redhat.com>
PR c++/90997
return true;
continue;
}
+ if (DECL_SIZE (field) && integer_zerop (DECL_SIZE (field)))
+ /* An empty field doesn't need an initializer. */
+ continue;
ftype = strip_array_types (TREE_TYPE (field));
if (type_has_constexpr_default_constructor (ftype))
{
}
if (init == error_mark_node)
return;
+ if (DECL_SIZE (member) && integer_zerop (DECL_SIZE (member))
+ && !TREE_SIDE_EFFECTS (init))
+ /* Don't add trivial initialization of an empty base/field, as they
+ might not be ordered the way the back-end expects. */
+ return;
/* A FIELD_DECL doesn't really have a suitable lifetime, but
make_temporary_var_for_ref_to_temp will treat it as automatic and
set_up_extended_ref_temp wants to use the decl in a warning. */
--- /dev/null
+// PR c++/90432
+// { dg-do compile { target c++11 } }
+
+struct empty {};
+
+struct has_empty {
+ [[no_unique_address]] empty brace_or_equal_initialized{};
+};
+
+struct has_value {
+ int non_zero = 1;
+};
+
+struct pair : has_empty, has_value {};
+
+pair a;