Hi! For variables which do have non-NULL DECL_NAME, register_local_var_uses uses either that name or name_depth_idx (that itself is a bug as it can clash with user variables named that way) for the fields. In C++26 we can have multiple _ variables in the same scope, so the following testcase is miscompiled by using the same FIELD_DECL multiple times (once for the first _ variable, once for the second one).
The following patch fixes it by pretending such variables don't have a name, so it uses a serial number then instead. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2026-05-20 Jakub Jelinek <[email protected]> PR c++/125376 * coroutines.cc (register_local_var_uses): Ignore DECL_NAME for name independent decls. * g++.dg/coroutines/pr125376.C: New test. --- gcc/cp/coroutines.cc.jj 2026-04-15 16:05:43.251129289 +0200 +++ gcc/cp/coroutines.cc 2026-05-19 11:53:32.694832799 +0200 @@ -4403,6 +4403,8 @@ register_local_var_uses (tree *stmt, int identify them in the coroutine frame. */ tree lvname = DECL_NAME (lvar); char *buf = NULL; + if (name_independent_decl_p (lvar)) + lvname = NULL_TREE; /* The outermost bind scope contains the artificial variables that we inject to implement the coro state machine. We want to be able --- gcc/testsuite/g++.dg/coroutines/pr125376.C.jj 2026-05-19 12:00:40.335622834 +0200 +++ gcc/testsuite/g++.dg/coroutines/pr125376.C 2026-05-19 12:00:36.190692718 +0200 @@ -0,0 +1,40 @@ +// PR c++/125376 +// { dg-do run { target c++26 } } + +#include <coroutine> + +struct task { + struct promise_type { + task get_return_object () noexcept { return {}; } + std::suspend_never initial_suspend () noexcept { return {}; } + std::suspend_never final_suspend () noexcept { return {}; } + void return_void () noexcept {} + void unhandled_exception () {} + }; +}; + +struct A { + unsigned value = 42; + A () {} + ~A () { if (value != 42) __builtin_abort (); } +}; + +struct B { + unsigned value = 43; + B () {} + ~B () { if (value != 43) __builtin_abort (); } +}; + +task +foo () +{ + auto _ = A {}; + auto _ = B {}; + co_return; +} + +int +main () +{ + foo (); +} Jakub
