c++: Fix [[no_unique_address]] and default mem-init [PR90432]

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.

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index da873da..80fb96e 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,13 @@
 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
 	* semantics.c (finish_call_expr): Don't call
 	instantiate_non_dependent_expr before warn_for_memset.
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index 8fd5e4f..b9b387c 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -821,6 +821,9 @@
 		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))
 	    {
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 6cd32d9..44ddc8c 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -860,6 +860,11 @@
 	}
       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.  */
diff --git a/gcc/testsuite/g++.dg/cpp2a/no_unique_address3.C b/gcc/testsuite/g++.dg/cpp2a/no_unique_address3.C
new file mode 100644
index 0000000..07108b8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/no_unique_address3.C
@@ -0,0 +1,16 @@
+// 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;