> Date: Wed, 7 Jun 2023 18:06:15 -0400 > From: Jason Merrill via Gcc-patches <gcc-patches@gcc.gnu.org>
> Tested x86_64-pc-linux-gnu, applying to trunk. > > -- 8< -- > > 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. This somehow caused 21 regressions for cris-elf in the c++ and libstdc++ testsuites. I opened PR110185 to hold the preprocessed g++.dg/cpp2a/spaceship-p1186.C. brgds, H-P