mirror of
https://forge.sourceware.org/marek/gcc.git
synced 2026-02-22 12:00:11 -05:00
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>
14 lines
225 B
C
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 });
|
|
}
|