<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/143828>143828</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [libc++] Possibly redundant auto-cast in `<async>`
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            libc++
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          frederick-vs-ja
      </td>
    </tr>
</table>

<pre>
    The uses of `_LIBCPP_AUTO_CAST` (originally introduced in ec0810e1c8e690ebbf571670820392d52fb23b75) seem introducing unnecessary move constructions.
https://github.com/llvm/llvm-project/blob/282e471018d234f78b0990100834532389877519/libcxx/include/future#L1866-L1882

If I understand correctly, auto cast (formerly decay-copy) is already happening when constructing the `tuple` in `__async_func`, so we're probably able to use perfect forwarding in `async` with `__async_func` slightly changed.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyUk8mK7DYUhp9G3ogqpCMP8sKL6r4paGhIQzrrQsOxrRuVVGjovn77YHeGu8gmINDqfOL83y-Vs1sC4kS6J9J9a1Qta0zTnNBicuaP00c-fVeNjnab3lekNWOmcaakZ7fXl6fnt7fb5ff3X2_Pl9_eSc8oARmTW1xQ3m_UhZKirQYtdYGiYZIz5EZiPzLUeu4G3g9MAhMj2A5mDUIPHYGRZsT7P-MuLLSGgAZzVmmj9_iB1MSQS6qmuBjymbDLWsojE3EhcCVwXVxZqz6beCdw9f7j7-v0SPE7mkLgqn3UBK4gAduBMy4tiHYepGbjyDhjUrSdACFHOQwdH3eA0-bHDwJXF4yvFglc51pqQgLilcu-P71yKYGwC2GXl5m-0BosplxUsNTElNAUvxF4pqqWSI3KZU9sjumOyW_UolHbycTHtmfgMlU-obIbXdXjgWHP4XPF8NPuYaFlxV1HqQ-PuwIXDjs3lbdgbnMNhvRsfzNH-okEhoT0kaJW2m9UaY-0xN0rfWCa0RQ6x_Spkt3ZX6yDtKM_XVn_A06zd8ta_EbNqsKC9tzYSdhRjKrBiQ_tODAOwJt1EmBNJ40YUXDoleZ86LhCrRnXjPd94yZg0LGeA2vZwPi5nYXpRdszNoNhjJGW4V05f95tnmNaGpdzxYm3QoJsvNLo81FngN0XgafjwF7vNB0d0HXJpGXe5ZL_5RRX_PERfhrrvtG3mLPbs0poa7AqlMPe6bD3FRARz18ZiV9Iz5qa_PS_23hskQlc_1rkY4I_AwAA____xCa7">