output_constructor doesn't like two consecutive entries with fields at the
same position; let's avoid adding the one for the empty field.

Tested x86_64-pc-linux-gnu, applying to trunk and 9.

gcc/cp/ChangeLog
2020-03-04  Jason Merrill  <ja...@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.
---
 gcc/cp/constexpr.c                              |  3 +++
 gcc/cp/init.c                                   |  5 +++++
 gcc/testsuite/g++.dg/cpp2a/no_unique_address3.C | 16 ++++++++++++++++
 3 files changed, 24 insertions(+)
 create mode 100644 gcc/testsuite/g++.dg/cpp2a/no_unique_address3.C

diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index c2d44605764..521c87f6210 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -831,6 +831,9 @@ cx_check_missing_mem_inits (tree ctype, tree body, bool 
complain)
            /* A flexible array can't be intialized here, so don't complain
               that it isn't.  */
            continue;
+         if (DECL_SIZE (field) && integer_zerop (DECL_SIZE (field)))
+           /* An empty field doesn't need an initializer.  */
+           continue;
          ftype = strip_array_types (ftype);
          if (type_has_constexpr_default_constructor (ftype))
            {
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 61ed3aa7e93..27623cf4db1 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -865,6 +865,11 @@ perform_member_init (tree member, tree init)
        }
       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 00000000000..07108b8b715
--- /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;

base-commit: 10bbbb591cfe6cac200e926a73f3b8065147ce84
-- 
2.18.1

Reply via email to