diff mbox series

[pushed] c++: constexpr, union, and no_unique_address [PR98994]

Message ID 20210209015146.2685746-1-jason@redhat.com
State New
Headers show
Series [pushed] c++: constexpr, union, and no_unique_address [PR98994] | expand

Commit Message

Jason Merrill Feb. 9, 2021, 1:51 a.m. UTC
My second patch for 97566 omits nested CONSTRUCTORs for empty fields, but we
do want them for empty union members.

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

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                               |  2 +-
 gcc/testsuite/g++.dg/cpp2a/no_unique_address12.C | 12 ++++++++++++
 2 files changed, 13 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/cpp2a/no_unique_address12.C


base-commit: 2da7ce23cfd81b67f77dc102d6f97dd19363b5f4
diff mbox series

Patch

diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index 1dbc2db9643..53567ad6f8b 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -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
index 00000000000..761d2086516
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/no_unique_address12.C
@@ -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;