https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94759

--- Comment #1 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Iain D Sandoe <ia...@gcc.gnu.org>:

https://gcc.gnu.org/g:b9c91b7f3279e23aed965c05197acf3b6f439f8d

commit r10-8004-gb9c91b7f3279e23aed965c05197acf3b6f439f8d
Author: Iain Sandoe <i...@sandoe.co.uk>
Date:   Tue Apr 28 00:27:47 2020 +0100

    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  <i...@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  <i...@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  <jwak...@redhat.com>
                Iain Sandoe  <i...@sandoe.co.uk>

            PR c++/94759
            * include/std/coroutine: Implement handing for non-
            class coroutine return types.

Reply via email to