diff options
author | Jason Merrill <jason@redhat.com> | 2023-06-07 05:15:02 -0400 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2023-06-07 18:06:26 -0400 |
commit | 28db36e2cfca1b7106adc8d371600fa3a325c4e2 (patch) | |
tree | 794314078aa0d221044c00a42a72367f25212057 /libgcc | |
parent | 941209f9da23b4e0f338ed970012fcfa7b20e528 (diff) | |
download | gcc-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