public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [pushed] c++: constexpr empty base redux [PR105622]
@ 2022-05-24 19:50 Jason Merrill
  0 siblings, 0 replies; only message in thread
From: Jason Merrill @ 2022-05-24 19:50 UTC (permalink / raw)
  To: gcc-patches

Here calling the constructor for s.__size_ had ctx->ctor for s itself
because cxx_eval_store_expression doesn't create a ctor for the empty field.
Then cxx_eval_call_expression returned the s initializer, and my empty base
overhaul in r13-160 got confused because the type of init is not an empty
class.  But that's OK, we should be checking the type of the original LHS
instead.  We also want to use initialized_type in the condition, in case
init is an AGGR_INIT_EXPR.

I spent quite a while working on more complex solutions before coming back
to this simple one.

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

	PR c++/105622

gcc/cp/ChangeLog:

	* constexpr.cc (cxx_eval_store_expression): Adjust assert.
	Use initialized_type.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp2a/no_unique_address14.C: New test.
---
 gcc/cp/constexpr.cc                           |  4 ++--
 .../g++.dg/cpp2a/no_unique_address14.C        | 19 +++++++++++++++++++
 2 files changed, 21 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/cpp2a/no_unique_address14.C

diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc
index 433fa767c03..0f1a43982d0 100644
--- a/gcc/cp/constexpr.cc
+++ b/gcc/cp/constexpr.cc
@@ -5916,15 +5916,15 @@ cxx_eval_store_expression (const constexpr_ctx *ctx, tree t,
   gcc_checking_assert (!*valp || (same_type_ignoring_top_level_qualifiers_p
 				  (TREE_TYPE (*valp), type)));
   if (empty_base || !(same_type_ignoring_top_level_qualifiers_p
-		      (TREE_TYPE (init), type)))
+		      (initialized_type (init), type)))
     {
       /* For initialization of an empty base, the original target will be
        *(base*)this, evaluation of which resolves to the object
        argument, which has the derived type rather than the base type.  In
        this situation, just evaluate the initializer and return, since
        there's no actual data to store, and we didn't build a CONSTRUCTOR.  */
+      gcc_assert (is_empty_class (TREE_TYPE (target)));
       empty_base = true;
-      gcc_assert (is_empty_class (TREE_TYPE (init)));
       if (!*valp)
 	{
 	  /* But do make sure we have something in *valp.  */
diff --git a/gcc/testsuite/g++.dg/cpp2a/no_unique_address14.C b/gcc/testsuite/g++.dg/cpp2a/no_unique_address14.C
new file mode 100644
index 00000000000..d3fcd4ad354
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/no_unique_address14.C
@@ -0,0 +1,19 @@
+// PR c++/105622
+// { dg-do compile { target c++20 } }
+
+struct empty {
+  empty() = default;
+  constexpr empty(int) { }
+};
+
+struct container {
+  empty __begin_ = {};
+  [[no_unique_address]] empty __size_ = 0;
+};
+
+constexpr bool test() {
+  container s;
+  return true;
+}
+static_assert(test());
+

base-commit: ae8decf1d2b8329af59592b4fa78ee8dfab3ba5e
-- 
2.27.0


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-05-24 19:50 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-24 19:50 [pushed] c++: constexpr empty base redux [PR105622] Jason Merrill

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).