On Sat, Mar 07, 2026 at 11:28:37AM -0800, Andrew Pinski wrote:
> So in the end the problem with pr103953.C is the lifetime
> of a lambda object is not extended past the statement.
> With sane operator new we are able to delete stores using
> that object as it is dead afterwards.
>
> So the fix to the testcase is to make the lambda its own
> object and then call it.
>
> I also went back to check to make sure the original issue was
> reproducible with this version too.
>
> Tested on x86_64-linux-gnu and the testcase failure is gone.
>
> PR testsuite/119930
>
> gcc/testsuite/ChangeLog:
>
> * g++.dg/coroutines/torture/pr103953.C: Store the second
> lambda into its own object to extend its lifeime.
>
> Signed-off-by: Andrew Pinski <[email protected]>
> ---
> gcc/testsuite/g++.dg/coroutines/torture/pr103953.C | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/gcc/testsuite/g++.dg/coroutines/torture/pr103953.C
> b/gcc/testsuite/g++.dg/coroutines/torture/pr103953.C
> index da559f8fa0d..1c6052e3f9f 100644
> --- a/gcc/testsuite/g++.dg/coroutines/torture/pr103953.C
> +++ b/gcc/testsuite/g++.dg/coroutines/torture/pr103953.C
> @@ -63,9 +63,11 @@ int main() {
> co_return;
> }();
>
> - task coroutine_B = [&coroutine_A]() ->task {
> + auto t = [&coroutine_A]() ->task {
Why the tab -> 8 spaces change?
Otherwise LGTM.
> co_await coroutine_A;
> - }();
> + };
At least when looking at gimple dump, the unpatched testcase does:
...
coroutine_B = {CLOBBER(bob)};
try
{
D.12223.__coroutine_A = &coroutine_A;
coroutine_B = main()::<lambda()>::operator() (&D.12223);
[return slot optimization]
}
finally
{
D.12223 = {CLOBBER(eos)};
}
try
{
std::__n4861::coroutine_handle<task::promise_type>::resume
(&coroutine_B.handle);
}
finally
{
task::~task (&coroutine_B);
}
...
so by the time resume is called, D.12223 lambda object is already out of
scope.
> +
> + task coroutine_B = t();
>
> coroutine_B.handle.resume();
> }
Jakub