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

            Bug ID: 95350
           Summary: [coroutines] coroutines with move-only by-value
                    parameters attempt to copy parameter instead of move
                    it
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: lewissbaker.opensource at gmail dot com
  Target Milestone: ---

The following code fails to compile under GCC 10.0 and GCC trunk.
Compile with -fcoroutines -std=c++2a

See https://godbolt.org/z/zB_RVC

This code compiles successfully under both Clang and MSVC coroutines
implementations.

-------------
#include <coroutine>

struct task {
    struct promise_type {
        task get_return_object();
        void return_void();
        void unhandled_exception();
        std::suspend_always initial_suspend() noexcept;
        std::suspend_always final_suspend() noexcept;
    };
};

struct move_only {
    move_only();
    move_only(const move_only&) = delete;
    move_only(move_only&) = delete;
    move_only(move_only&&) = default;
};

task f(move_only x) {
    co_return;
}

---------------------

Fails with compile-error:

<source>: In function 'task f(move_only)':
<source>:30:1: error: use of deleted function 'move_only::move_only(const
move_only&)'
   30 | }
      | ^
<source>:24:5: note: declared here
   24 |     move_only(move_only&) = delete;
      |     ^~~~~~~~~

When copying parameters into the coroutine frame which are passed by value
it should be initialising the parameter copy using an xvalue referring to the
original function parameter. Whereas it seems like GCC is attempting to
initialise the parameter-copy with an lvalue-reference to the original
parameter, which ends up calling the copy-constructor.

See http://eel.is/c++draft/dcl.fct.def.coroutine#13
> ... the copy is a variable of type cv T with automatic storage duration
> that is direct-initialized from an xvalue of type T referring to the
> parameter ...

Reply via email to