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 ...