c++: constexpr, union, and no_unique_address [PR98994]
authorJason Merrill <jason@redhat.com>
Mon, 8 Feb 2021 20:56:11 +0000 (15:56 -0500)
committerJason Merrill <jason@redhat.com>
Tue, 9 Feb 2021 01:51:24 +0000 (20:51 -0500)
My second patch for 97566 omits nested CONSTRUCTORs for empty fields, but we
do want them for empty union members.

gcc/cp/ChangeLog:

PR c++/98994
PR c++/97566
* constexpr.c (cxx_eval_store_expression): Only skip empty fields in
RECORD_TYPE.

gcc/testsuite/ChangeLog:

PR c++/98994
* g++.dg/cpp2a/no_unique_address12.C: New test.

gcc/cp/constexpr.c
gcc/testsuite/g++.dg/cpp2a/no_unique_address12.C [new file with mode: 0644]

index 1dbc2db964373087952eb9628f1aefabe8c0b8ef..53567ad6f8b3121178a6b3cc3f79187b20c56dd8 100644 (file)
@@ -5292,7 +5292,7 @@ cxx_eval_store_expression (const constexpr_ctx *ctx, tree t,
       type = refs->pop();
       tree index = refs->pop();
 
-      if (is_empty_field (index))
+      if (code == RECORD_TYPE && is_empty_field (index))
        /* Don't build a sub-CONSTRUCTOR for an empty base or field, as they
           have no data and might have an offset lower than previously declared
           fields, which confuses the middle-end.  The code below will notice
diff --git a/gcc/testsuite/g++.dg/cpp2a/no_unique_address12.C b/gcc/testsuite/g++.dg/cpp2a/no_unique_address12.C
new file mode 100644 (file)
index 0000000..761d208
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/98994
+// { dg-do compile { target c++20 } }
+
+struct empty {};
+
+union U {
+  constexpr U(): a() { }
+
+  [[no_unique_address]] empty a;
+};
+
+constexpr U u;