<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/91568>91568</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang-tidy] performance-unnecessary-value-param provide invalid hint for class with deleted move constructor
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang-tidy,
false-positive
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
PiotrZSL
</td>
</tr>
</table>
<pre>
Example:
```
#include <optional>
struct Some
{
Some();
Some(const Some&);
Some(Some&&) = delete;
};
struct Other
{
Other(std::optional<Some> some)
: some(std::move(some))
{
}
std::optional<Some> some;
};
```
Produces:
- <source>:13:31: warning: the parameter 'some' is copied for each invocation but only used as a const reference; consider making it a const reference [performance-unnecessary-value-param]
- <source>:14:14: warning: passing result of std::move() as a const reference argument; no move will actually happen [performance-move-const-arg]
But when removing std::move:
- <source>:14:14: warning: parameter 'some' is passed by value and only copied once; consider moving it to avoid unnecessary copies [performance-unnecessary-value-param]
In such case, check suggest developer to add std::move, but when actually moving it, other check says that's not valid.
For classes with deleted move constructor check should not suggest to use std::move.
Bug looks to be in:
- utils::type_traits::hasNonTrivialMoveConstructor
- utils::type_traits::hasNonTrivialMoveAssignment
as those functions do not check if constructor is deleted.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVctu6zYQ_Rp6M7AhkZEdL7Rw7GugQB8XuF11U1DkSGJDkQIfSv33BSnFTpybvgBjLI3mcc6cEcW9V51BrEn1RKrTisfQW1d_VTa43779uGqsvNRf_uTDqJGwAylOpDiQbbH85lvKlBE6SgTCjnYMyhquCfuyPM7WBxdFgG92wMW9e5ovAGB200dC94R9dAtr_JJKt5_EXJ-mACDsBBI1BrzGvnY93XkWYL-EHt09stlJH32QiTw73Mgdc0P2BXxuvL8BAiDssLhvmYOd8v0SfU14N4aE7nrzj02vPN5yupMm26_OyijQ3wTMdp3k8jY6kWoSdigZYQdWJvgv3BllunQZeoSROz5gQAeE7mYOO1AehB0VSmitA-SiB2UmK3iCC00MYI2-QPQogXvgMOvosEWHJjV9yi4l0cHAn5XpQIWPcUCqpxFda93AjcB1NAYFes_dZT1xHXGd4ZHq9Bmvh1fzlteYdt904NBHHcC2cC9W2qTvAQfuujigCYmBsZDC4UVpDVyEyLW-QM_HEc098hS4zsXW3HVXwLN9igFeejTgcLBTQvYeD_tUtk_ofV-yRBslNBfIswNu5KzToqX9oMwMRgUIFvhklYQ3Csxp_r9qNNsfDPgoehDcI6FHED2KZ_Cx69AHkDihtiO63FjKe32OecfyyK5zv4JNj216fV-L8ouH0POQpgHGhkRfyc0M5GwdCJ0m4-FFhX45POQsbVYsnRL2Wq23Uctc5hVtsGnT32PcvNe3A23ts0-hDYIybySNQWk_J4bLiL8Hx1VYHD33P1vzq1OT4vonO-Hxhud_5R_yoZ8XOKfzNBnrEdpoRHp5PUibyc1sVftuBMq_jmfht5I1k3u25yusy11Z0YeSluWqr1E221JI3op2i4JvS8bb_b5hyLf0sSp3K1XTgj4UVbEvdhVj5YbxZs_ETm7bYiuERPJQ4MCV3mg9DRvrupXyPmK9L6vt40rzBrXP3y5KheamWwclL4RSQo-E0pZrj-vRehVU2hiaPnGuTrXWTew8eSi08sHfqgcVdP4YvqlWneBfrDaMzk5KJl3zZkGvTMgnY16sv1-rVXS67kMYs2T0TOi5U6GPzUbYgdBzwrf8rUdn_0ARCD3nUXhCz3kafwUAAP__5ch7uw">