<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=http://email.email.llvm.org/c/eJytVdtyqjAU_Rp8ydTBoAIPPFhtP6A_4IRkIzmGxJOLbf_-7IDXaqed9jgYAtlZWfu2qI14r5bBWtCeeBv0lpiGLBXTG2LhD3DviG-lI3umpCA7azaWdUm2SNJVki6SeXq4hkeaSc1VEECSbMmNNcFLDUn2dHfdeaFkfVrlijlHpN6bLViS5I_D612oleSnIwn-rizXSKqTDs47osmdXfF3RN-AX1vwweq1qaObCS0SWkYMMrw_mkbUfJVkjyTersBY8AbNpJdMrV1wO9DiFge9jDSyxcFirWH_NWwj9Q2oNvDGYed_hb43mMeD63F-JnzfNOiWaaFArIfDpdEXPp6OZ7WxhyDeHDtQOT8HJ7G8Dmlb-_ddLIfVx3xebTkm4z7Z8yo32vnz87y3RmwBCvwnkHNidmCZNxYtf4hRXJr_6NTvAFwGchiP9dxcRObcJuZQ41cA9xr3VfoW-xwIWBsJfdLe2dKZYHnf0NmCTnDAbC9OuwhnShGs3oG3IH0obeDoZdSVhOYnN_NvONAXz-zp7umTHIdZPFSbGKLFNTppmSM1gCbwtkMlkF69k47ZLbI6smvBwm9y-Rm1_EjvRK2Dro6aRvM7wpMjNiqavWH03wXrq5hS-jGmTdA8tjzBTwAjJ0UnIkDMc0DZHfJ6rrUY-ys3bsvwmsOHIuvHF1AspkhIx4NzUXSQTev9zsXqpM94Oc_41qDaNcq8jrnp8N1f_M_plJZFMcFpntHZrCxHospEmZVshNraGls9g7CjYFV1jbjBNgj1AUqp_fH2gJI0xPxZOhfA4WSWpWUxaisQc1pMiqlogDdzaIRgRdFQns6LdFrydKRYDcpVyewxoVTDK-khcJ7MVqPfM5AVTSlNJ2k5odOC5mORN3kzFSWjk6YUMEmmKXRMqnHEGRu7Gdmqh6zDxuGiks678yJ-WeVGA_SEkaHHzoHqZSixXqsx4Zel0AVUS6wX7DbSYToeTk0vawWjnm7Vc_0HkvuCew>53098</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Return type of a coroutine must not be move-constructible
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          Fedr
      </td>
    </tr>
</table>

<pre>
    Current trunk of Clang rejects this valid program:
```
#include <coroutine>
#include <cstdlib>
class invoker {
public:
    class invoker_promise {
    public:
        invoker get_return_object() { return invoker{}; }
        auto initial_suspend() { return std::suspend_never{}; }
        auto final_suspend() noexcept { return std::suspend_never{}; }
        void return_void() {}
        void unhandled_exception() { std::abort(); }
    };
    using promise_type = invoker_promise;
    invoker() {}
    invoker(const invoker&) = delete;
    invoker& operator=(const invoker&) = delete;
    invoker(invoker&&) = delete;
    invoker& operator=(invoker&&) = delete;
};

invoker f() {
    co_return;
}
```
with the error:
```
<source>:21:9: error: call to deleted constructor of 'invoker'
invoker f() {
        ^
<source>:17:5: note: 'invoker' has been explicitly marked deleted here
    invoker(invoker&&) = delete;
    ^
<source>:7:17: note: member 'get_return_object' declared here
        invoker get_return_object() { return invoker{}; }
                ^
<source>:22:5: note: function is a coroutine due to use of 'co_return' here
    co_return;
    ^
```

Related discussion: https://stackoverflow.com/q/62429881/7325599
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJytVd1yqjAQfhq4ydSBgCIXXFhtH6Av4ASyaI4h8eTHtm9_NqCi1U477WEghGTz7be_1Jq_V0tvDChHnPFqR3RLlpKpDTHwBxpnidsKSw5MCk72Rm8M66JsESWrKFlEs-R4D580E6qRngOJsmWjjfZOKIiyp7v71nEp6vNuI5m1RKiD3oEhUfE4LO99LUVzVknwupJcI6lOWBhPBJE7p8J1Qt-AWxtw3qi1roOZEZ1HtAwYZFg_iQbUYhVljyS8rsCYdxrFhBNMrq23e1D8FgetDDSyxVFireDwNWwr1A2o0vDWwN79Cv2gMY5H08N8JHxf1KstU1wCXw_KhVYXNp7Vs1qboxNv1A5Uxm9vBabXMWxr974P6bD6GM-rI6dg3Cc77jZaWTd-z3ppxOYgwX0COSN6D4Y5bVDyhxjzS_Efaf0OwKUjh_GUz-2FZ8Yy0cccvwK4V7ivwm2xzoGAMYHQJ-WdLa32pukLOlvQFAeM9uJ8ijRMSoLZO_DmpHel8Q1aGfpKRIuzmcU3DOiTZ_p0V3ta4DANSpUOLlpco5Mts6QGUATe9tgJhJPvpGNmh6xO7LZg4Dex_IxacaJ3ptZBV4eeRos7jadAbOxo5obRf29YX_mU0o8-bb1qQskT_AUwcu7ohHsIcfbYdoe4jrkWfH9lxm0aXnP4kGT9-AKShRBxYRtvbWg6yGbr3N6G7KTPeFvHmp3GbtdK_TppdIdrf_GZ0ZyW83mK0yKj02lZxrzKeJmVLHaYB1C9DA7rOw_SvzSs81j7aD3mDukQ_OGcwqKWEHsjq2sWGywdXx_VS3k4vR6wjQ1xehbWerA4mWZJOY-3VZ43RVEmNSRlU6cUWJYmZZ1DmhfQsnoeS1aDtFU0fYwoVfBKegicR9NVLCqaUJrgkZTmc1pMeNEWbc5LRtO25JBGeQIdE3ISeEy02cSm6inVfmNxUwrr7LiJ_1KxUQC9OsTH_89Wm-oZuIl7vVXP-x8tLWyM">