coroutines: Handle awaiters that are sub-objects [PR95736]
authorIain Sandoe <iain@sandoe.co.uk>
Sat, 27 Jun 2020 07:18:34 +0000 (08:18 +0100)
committerIain Sandoe <iain@sandoe.co.uk>
Sat, 27 Jun 2020 08:43:54 +0000 (09:43 +0100)
commitdaaed0199ee57013ae011421a7e90b7bdd295373
tree3c3047efa45a9dfa3f8f3b9e178fea691f99deb1
parent9c5ca11a33fa91345fe813d449ddc4a821fc72d5
coroutines: Handle awaiters that are sub-objects [PR95736]

Move deciding on initializers for awaitables to the build of the
co_await, this allows us to analyse cases that do not need
a temporary at that point.

As the PR shows, the late analysis meant that we  were not
checking properly for the case that an awaiter is a sub-object
of an existing variable outside the current function scope (and
therefore does not need to be duplicated in the frame).

gcc/cp/ChangeLog:

PR c++/95736
* coroutines.cc (get_awaitable_var): New helper.
(build_co_await): Check more carefully before
copying an awaitable.
(expand_one_await_expression): No initializer
is required when the awaitable is not a temp.
(register_awaits): Remove handling that is now
completed when the await expression is built.

gcc/testsuite/ChangeLog:

PR c++/95736
* g++.dg/coroutines/pr95736.C: New test.
gcc/cp/coroutines.cc
gcc/testsuite/g++.dg/coroutines/pr95736.C [new file with mode: 0644]