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