Commit e0804c9b by Jason Merrill Committed by Jason Merrill

PR c++/93143 - incorrect tree sharing with constexpr.

We don't unshare CONSTRUCTORs as often during constexpr evaluation, so we
need to unshare them here.

	* constexpr.c (cxx_eval_outermost_constant_expr): Don't assume
	CONSTRUCTORs are already unshared.

From-SVN: r280127
parent 640b23d7
2020-01-10 Jason Merrill <jason@redhat.com> 2020-01-10 Jason Merrill <jason@redhat.com>
PR c++/93143 - incorrect tree sharing with constexpr.
* constexpr.c (cxx_eval_outermost_constant_expr): Don't assume
CONSTRUCTORs are already unshared.
PR c++/93173 - incorrect tree sharing. PR c++/93173 - incorrect tree sharing.
PR c++/93033 PR c++/93033
* cp-gimplify.c (cp_gimplify_init_expr, cp_gimplify_expr): Use * cp-gimplify.c (cp_gimplify_init_expr, cp_gimplify_expr): Use
......
...@@ -6347,10 +6347,10 @@ cxx_eval_outermost_constant_expr (tree t, bool allow_non_constant, ...@@ -6347,10 +6347,10 @@ cxx_eval_outermost_constant_expr (tree t, bool allow_non_constant,
if (!non_constant_p && overflow_p) if (!non_constant_p && overflow_p)
non_constant_p = true; non_constant_p = true;
/* Unshare the result unless it's a CONSTRUCTOR in which case it's already /* Unshare the result. */
unshared. */
bool should_unshare = true; bool should_unshare = true;
if (r == t || TREE_CODE (r) == CONSTRUCTOR) if (r == t || (TREE_CODE (t) == TARGET_EXPR
&& TARGET_EXPR_INITIAL (t) == r))
should_unshare = false; should_unshare = false;
if (non_constant_p && !allow_non_constant) if (non_constant_p && !allow_non_constant)
......
// PR c++/93143
// { dg-do run { target c++11 } }
struct A { char a[2]; };
static constexpr A foo () { return A{1}; }
void bar ()
{
A a = foo ();
if (a.a[0] != 1)
__builtin_abort();
}
void foobar ()
{
A x[] = { foo (), foo () };
A a = foo ();
if (a.a[0] != 1)
__builtin_abort();
}
int main()
{
bar();
foobar();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment