<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/130444>130444</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang-tidy] Check request: call-std-swap-universally-in-generic
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang-tidy
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
denzor200
</td>
</tr>
</table>
<pre>
Needs a check that will find a call to `std::swap` which compiles with only bounded set of objects, and not intended to be in generic code, but it is.
For example:
```
template<typename T>
void process(T& a, T& b) {
{
std::swap(a, b); // (1) BAD
}
{
swap(a, b); // (2) BAD
}
{
a.swap(b); // (3) BAD
}
{
using std::swap;
swap(a, b); // OK
}
}
void nongeneric_code_0(int& a, int& b) {
std::swap(a, b); // OK
}
void nongeneric_code_1(Cookie& a, Cookie& b) {
swap(a, b); // OK
}
```
Here is the full snippet to play: https://godbolt.org/z/r9hGTjed5
The check will suggest to change the code for `(1) BAD` and `(2) BAD`, for `(3) BAD` no change will be suggested, only warning produced.
For both bad cases before C++20 the following fix will be suggested:
```
using std::swap;
swap(a, b);
```
In C++20 and later we should propose shorter fix:
```
std::ranges::swap(a, b);
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyUVU2T4yYQ_TXo0mUXQh-WDzrInjhJpSq5zH0LiZbELgYF0Hi8vz4Fo7E9Xk-SVblshLvfo5v3gDsnB41Yk2JHiqeEz340thaovxvLKE1aI841oc2fiMIBh27E7hv4kXs4SaWgl1qEaa4UeAOkpM4LkjUka9yJT6SkcBplN0JnjpNU6OAk_QhGqzO0ZtYCBTj0YHow7VfsvCNsD1wL0MaD1B5jiDfQIkgNA2q0soPOCAyR7exBepBuTWhzMBbwlR8nhWEJtCElXT608XicFPdIsr0_T6j5EeGZZL8Q2rwYKWCypkPnCKueCSuBB_Q4agnbAtnsCG0A4H30sUxWxfgQSrIdEHYg7ACEVWlI3jVPl-SnjzDL8wgkPlck9v-Q-HrB-gBzg5P9B87spB7uyst-Zq1__fEBevleuqyNXrbwS9jCL5SwSmp_6fgyvuv5vzb7nvqN8CFbSli1N-abxAvh9fWe87MyH_PdSu03tAjSgR8R-lkpcFpOE_og40nxM8kaGL2fXCgqIg1GtEb5tbEDYYfvhB3sdvz1-SuK4q15zyMu3ou2c_MwoIuA3cj1gJEr1Ai9scGGt9oraXTU2yy7zobSruHZTbi-4Ea6Ft8ZUYSkaN8TtzpIZbJGzB2Kdwe2xo_QcgEdd-igxd5YhD1hO8J2jL51xShlTiG7l68POH5w76eqfLBNd6m_6xvy0IdwClg4IbjRzCo6fzIuvtrwTy9ff1zAhdqGtrhP5XiXlog6E9tsyxOs002e5puiTItkrEssyzQTeVHlAjebakvLKm27LWN92hdtn8iaUVbQjFYsS7OsWHftphIVZazY0BzLkuQUj1yqtVIvx6CcRDo3Y51mNM_zRPEWlYsHO2Od4npYeSnOhLFw0Ns6ZK3aeXAkp0o67644XnoVr4SbtOIJ9lF_Fv-e0fmg4XDqr5wXq9CH1azlC1rHlTqvpF4txktmq-o7sUs_zu26M0fCDoF0-VlN1oQrgLBDrMQRdliKeanZPwEAAP__0i7ooQ">