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