c++: NRV in lambda in template [PR91217]
authorJason Merrill <jason@redhat.com>
Sat, 3 Apr 2021 05:07:36 +0000 (01:07 -0400)
committerJason Merrill <jason@redhat.com>
Sat, 3 Apr 2021 05:54:03 +0000 (01:54 -0400)
commit04771106cda8dca2c8b975fd4648933679455b8f
treee7f647a1c2791495e4c14eb76e60b1dea5bfdb65
parent7c3ba2145ceddb0fd7f85fbf27f8db81896527d1
c++: NRV in lambda in template [PR91217]

tsubst_lambda_expr was producing a function with two blocks that claimed to
be the outermost block in the function body, one from the call to
start_lambda_function in tsubst_lambda_expr, and one from tsubsting the
block added by start_lambda_function when we first parsed the lambda.  This
messed with the named return value optimization, which only works for
variables in the outermost block.

gcc/cp/ChangeLog:

PR c++/91217
* pt.c (tsubst_lambda_expr): Skip the body block from
DECL_SAVED_TREE.

gcc/testsuite/ChangeLog:

PR c++/91217
* g++.dg/opt/nrv20.C: New test.
gcc/cp/pt.c
gcc/testsuite/g++.dg/opt/nrv20.C [new file with mode: 0644]