coroutines: Add a cleanup expression for g-r-o when needed [PR95477].
authorIain Sandoe <iain@sandoe.co.uk>
Tue, 23 Jun 2020 09:06:21 +0000 (10:06 +0100)
committerIain Sandoe <iain@sandoe.co.uk>
Tue, 23 Jun 2020 17:37:42 +0000 (18:37 +0100)
commit788b962aa00959e861b45767c5c88ec41ca30c21
treeca5baf402ff7008dc7ed672f0c6ff906623863c0
parent17964eb3a054c634b743aae9d1d9414e1bf21885
coroutines: Add a cleanup expression for g-r-o when needed [PR95477].

The PR reports that we fail to destroy the object initially created from
the get-return-object call.  Fixed by adding a cleanup when the DTOR is
non-trivial.  In addition, to meet the specific wording that the call to
get_return_object creates the glvalue for the return, we must construct
that in-place in the return object to avoid a second copy/move CTOR.

gcc/cp/ChangeLog:

PR c++/95477
* coroutines.cc (morph_fn_to_coro): Apply a cleanup to
the get return object when the DTOR is non-trivial.

gcc/testsuite/ChangeLog:

PR c++/95477
* g++.dg/coroutines/pr95477.C: New test.
* g++.dg/coroutines/void-gro-non-class-coro.C: New test.
gcc/cp/coroutines.cc
gcc/testsuite/g++.dg/coroutines/pr95477.C [new file with mode: 0644]
gcc/testsuite/g++.dg/coroutines/void-gro-non-class-coro.C [new file with mode: 0644]