Files
gcc-reflection/gcc/testsuite/g++.dg/cpp1y/constexpr-prvalue2.C
Marek Polacek 68da968e46 c++: ICE with MODIFY_EXPR in constexpr [PR118169]
Here, cxx_eval_outermost_expression gets a sequence of initialization
statements:

  D.2912.t = TARGET_EXPR <...>;
  TARGET_EXPR <D.2922, 1>;
  D.2922 = 0;

the last of which wasn't converted to void and so we, since r15-6369,
do not take the "if (VOID_TYPE_P (type))" path, and try to set
D.2912 to false.

The last statement comes from build_disable_temp_cleanup.
convert_to_void is typically called from finish_expr_stmt, but we are
adding the cleanup statement via add_stmt which doesn't convert to void.
So I think we can use finish_expr_stmt instead.

	PR c++/118169

gcc/cp/ChangeLog:

	* typeck2.cc (split_nonconstant_init): Call finish_expr_stmt instead
	of add_stmt.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp1y/constexpr-prvalue2.C: New test.

Reviewed-by: Jason Merrill <jason@redhat.com>
2025-01-08 09:27:45 -05:00

14 lines
225 B
C

// PR c++/118169
// { dg-do compile { target c++14 } }
// { dg-options "-O" }
struct A { constexpr A (int *x) : s(x) {} ~A (); int *s; };
struct B { A t; int u = 0; };
void foo (B &&);
void
bar (int &x)
{
foo ({ &x });
}