c++: Fix reuse of class constants [PR94453]
authorJason Merrill <jason@redhat.com>
Sat, 4 Apr 2020 15:04:55 +0000 (11:04 -0400)
committerJason Merrill <jason@redhat.com>
Sat, 4 Apr 2020 15:06:31 +0000 (11:06 -0400)
commit9f143008c73c60e02634d6b433139a035ef7bb65
treedde2a0566499fe03a7c93a2f784d3b3cad280477
parent2523d721cfc861a3abea6e97736446c99ba8b52d
c++: Fix reuse of class constants [PR94453]

The testcase hit an ICE trying to expand a TARGET_EXPR temporary cached from
the other lambda-expression.  This patch fixes this in two ways:

1) Avoid reusing a TARGET_EXPR from another function.
2) Avoid ending up with a TARGET_EXPR at all; the use of 'p' had become
<TARGET_EXPR<NON_LVALUE_EXPR<TARGET_EXPR ...>>>, which doesn't make any
sense.

gcc/cp/ChangeLog
2020-04-04  Jason Merrill  <jason@redhat.com>

PR c++/94453
* constexpr.c (maybe_constant_value): Use break_out_target_exprs.
* expr.c (mark_use) [VIEW_CONVERT_EXPR]: Don't wrap a TARGET_EXPR in
NON_LVALUE_EXPR.
gcc/cp/ChangeLog
gcc/cp/constexpr.c
gcc/cp/expr.c
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-constexpr1.C [new file with mode: 0644]