Currently, coroutine frames store all variables of a coroutine separately, even if their lifetime does not overlap (they are in distinct scopes). This patch implements overlapping distinct variable scopes in the coroutine frame, by storing the frame fields in nested unions of structs. This lowers the size of the frame for larger coroutines significantly, and makes them more usable on systems with limited memory. Bootstrapped and regression tested on x86_64-pc-linux-gnu; new test fails before the patch and succeeds after with no regressions. PR c++/105989 gcc/cp/ChangeLog: * coroutines.cc (struct local_var_info): Add field_access_path. (build_local_var_frame_access_expr): New. (transform_local_var_uses): Use build_local_var_frame_access_expr. (coro_make_frame_entry_id): New. (coro_make_frame_entry): Delegate to coro_make_frame_entry_id. (struct local_vars_frame_data): Add orig, field_access_path. (register_local_var_uses): Generate new frame layout. Create access paths to vars. (morph_fn_to_coro): Set new fields in local_vars_frame_data. gcc/testsuite/ChangeLog: * g++.dg/coroutines/pr105989.C: New test.