diff mbox series

[committed] c++: Fix empty base stores in cxx_eval_store_expression [PR100111]

Message ID 20210416154721.GG3748@tucnak
State New
Headers show
Series [committed] c++: Fix empty base stores in cxx_eval_store_expression [PR100111] | expand

Commit Message

Jakub Jelinek April 16, 2021, 3:47 p.m. UTC
Hi!

In r11-6895 handling of empty bases has been fixed such that non-lval
stores of empty classes are not added when the type of *valp doesn't
match the type of the initializer, but as this testcase shows it is
done only when *valp is non-NULL.  If it is NULL, we still shouldn't
add empty class constructors if the type of the constructor elt *valp
points to doesn't match.

Bootstrapped/regtested on x86_64-linux and i686-linux, tested also by
Liu Hao on 10 branch, preapproved by Jason in the PR, committed to
trunk.

2021-04-16  Jakub Jelinek  <jakub@redhat.com>

	PR c++/100111
	* constexpr.c (cxx_eval_store_expression): Don't add CONSTRUCTORs
	for empty classes into *valp when types don't match even when *valp
	is NULL.

	* g++.dg/cpp0x/constexpr-100111.C: New test.


	Jakub
diff mbox series

Patch

--- gcc/cp/constexpr.c.jj	2021-04-08 17:19:12.235414181 +0200
+++ gcc/cp/constexpr.c	2021-04-16 11:06:27.138019389 +0200
@@ -5518,6 +5518,14 @@  cxx_eval_store_expression (const constex
       CONSTRUCTOR_NO_CLEARING (*valp)
 	= CONSTRUCTOR_NO_CLEARING (init);
     }
+  else if (TREE_CODE (init) == CONSTRUCTOR
+	   && !same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (init),
+							  type))
+    {
+      /* See above on initialization of empty bases.  */
+      gcc_assert (is_empty_class (TREE_TYPE (init)) && !lval);
+      return init;
+    }
   else
     *valp = init;
 
--- gcc/testsuite/g++.dg/cpp0x/constexpr-100111.C.jj	2021-04-16 11:33:20.193882609 +0200
+++ gcc/testsuite/g++.dg/cpp0x/constexpr-100111.C	2021-04-16 11:32:46.039266786 +0200
@@ -0,0 +1,7 @@ 
+// PR c++/100111
+// { dg-do compile { target c++11 } }
+// { dg-options "-fno-elide-constructors" }
+
+struct A {};
+struct B : A { int b; constexpr B (A x) : A(x), b() {} };
+struct C { B c; constexpr C () : c({}) {} } d;