coroutines: Fix handling of non-class coroutine returns [PR94759]
authorIain Sandoe <iain@sandoe.co.uk>
Mon, 27 Apr 2020 23:27:47 +0000 (00:27 +0100)
committerIain Sandoe <iain@sandoe.co.uk>
Tue, 28 Apr 2020 01:07:37 +0000 (02:07 +0100)
commitb9c91b7f3279e23aed965c05197acf3b6f439f8d
treef1defb0510f253de446d9aa6875ab7a5772c0a0a
parent5726da6bdcdc58c44eafd60814aee074bf9d835a
coroutines: Fix handling of non-class coroutine returns [PR94759]

From the standard:

The header <coroutine> defines the primary template coroutine_traits
such that if ArgTypes is a parameter pack of types and if the
qualified-id R::promise_type is valid and denotes a type, then
coroutine_traits<R,ArgTypes...> has the following publicly accessible
member:
     using promise_type = typename R::promise_type;

this should not prevent more specialised cases and  the following
code should be accepted, but is currently rejected with:

'error: coroutine return type ‘void’ is not a class'

This is because the check for non-class-ness of the return value was
in the wrong place; it needs to be carried out in a SFINAE context.

The following patch removes the restriction in the traits template
instantiation and allows for the case that the ramp function could
return void.

The <coroutine> header is amended to implement the required
functionality.

gcc/cp/ChangeLog:

2020-04-28  Iain Sandoe  <iain@sandoe.co.uk>

PR c++/94759
* coroutines.cc (coro_promise_type_found_p): Do not
exclude non-classes here (this needs to be handled in the
coroutine header).
(morph_fn_to_coro):  Allow for the case where the coroutine
returns void.

gcc/testsuite/ChangeLog:

2020-04-28  Iain Sandoe  <iain@sandoe.co.uk>

PR c++/94759
* g++.dg/coroutines/coro-bad-alloc-00-bad-op-new.C: Adjust for
updated error messages.
* g++.dg/coroutines/coro-bad-alloc-01-bad-op-del.C: Likewise.
* g++.dg/coroutines/coro-bad-alloc-02-no-op-new-nt.C: Likewise.
* g++.dg/coroutines/coro-missing-promise.C: Likewise.
* g++.dg/coroutines/pr93458-5-bad-coro-type.C: Liekwise.
* g++.dg/coroutines/torture/co-ret-17-void-ret-coro.C: New test.

libstdc++-v3/ChangeLog:

2020-04-28  Jonathan Wakely  <jwakely@redhat.com>
    Iain Sandoe  <iain@sandoe.co.uk>

PR c++/94759
* include/std/coroutine: Implement handing for non-
class coroutine return types.
gcc/cp/ChangeLog
gcc/cp/coroutines.cc
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/coroutines/coro-bad-alloc-00-bad-op-new.C
gcc/testsuite/g++.dg/coroutines/coro-bad-alloc-01-bad-op-del.C
gcc/testsuite/g++.dg/coroutines/coro-bad-alloc-02-no-op-new-nt.C
gcc/testsuite/g++.dg/coroutines/coro-missing-promise.C
gcc/testsuite/g++.dg/coroutines/pr93458-5-bad-coro-type.C
gcc/testsuite/g++.dg/coroutines/torture/co-ret-17-void-ret-coro.C [new file with mode: 0644]
libstdc++-v3/ChangeLog
libstdc++-v3/include/std/coroutine