aboutsummaryrefslogtreecommitdiff
path: root/libgcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2023-06-07 05:15:02 -0400
committerJason Merrill <jason@redhat.com>2023-06-07 18:06:26 -0400
commit28db36e2cfca1b7106adc8d371600fa3a325c4e2 (patch)
tree794314078aa0d221044c00a42a72367f25212057 /libgcc
parent941209f9da23b4e0f338ed970012fcfa7b20e528 (diff)
downloadgcc-28db36e2cfca1b7106adc8d371600fa3a325c4e2.zip
gcc-28db36e2cfca1b7106adc8d371600fa3a325c4e2.tar.gz
gcc-28db36e2cfca1b7106adc8d371600fa3a325c4e2.tar.bz2
c++: allow NRV and non-NRV returns [PR58487]
Now that we support NRV from an inner block, we can also support non-NRV returns from other blocks, since once the NRV is out of scope a later return expression can't possibly alias it. This fixes 58487 and half-fixes 53637: now one of the returns is elided, but not the other. Fixing the remaining xfails in these testcases will require a very different approach, probably involving a full tree/block walk from finalize_nrv, and check_return_expr only adding to a list of potential return variables. PR c++/58487 PR c++/53637 gcc/cp/ChangeLog: * cp-tree.h (INIT_EXPR_NRV_P): New. * semantics.cc (finalize_nrv_r): Check it. * name-lookup.h (decl_in_scope_p): Declare. * name-lookup.cc (decl_in_scope_p): New. * typeck.cc (check_return_expr): Allow non-NRV returns if the NRV is no longer in scope. gcc/testsuite/ChangeLog: * g++.dg/opt/nrv26.C: New test. * g++.dg/opt/nrv26a.C: New test. * g++.dg/opt/nrv27.C: New test.
Diffstat (limited to 'libgcc')
0 files changed, 0 insertions, 0 deletions