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

    <tr>
        <th>Summary</th>
        <td>
            [clang-tidy] Check request: use `std::tie` to implement lexicographical comparison
        </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>
    
Assume the structure:
```
struct A {
    int n;
    std::string s;
    float w;
    float v;
    float d() const noexcept { return w / v; }
};
```

And this struct has user defined operators with field-by-field manual comparison:
```
bool operator<(const A& lhs, const A& rhs) noexcept
{
    if (lhs.n != rhs.n) {
        return lhs.n < rhs.n;
    } else if (lhs.s != rhs.s) {
        return lhs.s < rhs.s;
    }
    return lhs.d() < rhs.d();
}

bool operator>(const A& lhs, const A& rhs) noexcept
{
    if (lhs.n != rhs.n) {
        return lhs.n > rhs.n;
    } else if (lhs.s != rhs.s) {
        return lhs.s > rhs.s;
    }
    return lhs.d() > rhs.d();
}

bool operator<=(const A& lhs, const A& rhs) noexcept
{
    return !(lhs > rhs);
}

bool operator>=(const B& lhs, const A& rhs) noexcept
{
    return !(lhs < rhs);
}

```

We need a check that will suggest to reimplement that operator in a better way using `std::tie`:
```
bool operator<(const A& lhs, const A& rhs) noexcept
{
 const auto lhs_d = lhs.d();
    const auto rhs_d = rhs.d();
    return std::tie(lhs.n, lhs.s, lhs_d) < std::tie(rhs.n, rhs.s, rhs_d);
}

bool operator>(const A& lhs, const A& rhs) noexcept
{
    const auto lhs_d = lhs.d();
    const auto rhs_d = rhs.d();
    return std::tie(lhs.n, lhs.s, lhs_d) > std::tie(rhs.n, rhs.s, rhs_d);
}

bool operator<=(const A& lhs, const A& rhs) noexcept
{
    return !(lhs > rhs); // remains unchanged
}

bool operator>=(const B& lhs, const A& rhs) noexcept
{
 return !(lhs < rhs); // remains unchanged
}
```

</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzMVt1u6zYMfhr5hkigyHZ-LnzhJukr7HJQJMbWpkiZKLWne_pBjpO66UHRYS12ggC25Y_kx08iTUlkOofYsPqB1btCptj70Gh0f_sgOC8OXr80jLctUTohxB6BYkgqpoCsbBlv2ZKPf95eXkELbPXAeAsAYFwEx8rrI0WdzcoMNa4Den11tF5GeL5feLpf0EysmdiA8o4iOI8_FJ5jDgkBYwoOnoGJx8EQ2GqXOa52Fy9TsjkrpyH2hsacoJcEiTCAxqNxqMGfMcjoA8GziT0cDVo9O7zMhhs4SZekBeVPZxkMefdekYP39uaFlVsm1hfeLRNLsD0xsYXJSsgrm1tWA_eblEdgYm17mjtgYsHKXYbPXTZ4ReXfqMMILbcj7iYkW-0ALeHEJU1d0ocu6eaS3rgc7ybI61Zd8ePzuBeXrXmn0f5_0Wj_9Rrt_6VG-89rtGXl7r_INMbP6QypXaN_YnMmgR--JPD254HvSvU3BIeoQYLqUf0Jsc_NwlgLlLoOKUL0ENCczhZP6OIFcCUOxoGEA8aIAZ7lCyTK3Yct-a0hRYM52PdV8AUjU_TZ6ncN-STZ-x3PIk2Q4YZ8dzYmcr5JYjz-mZa9nNPtJeC1Eu_Q4YoOV3QY0d9Yp7-IGPuvEuN7CzJ_z_InLeBJGkeQnOql61B_V6V-XKafoDMpoEI3pd6UG1lgs1iV9XJRrnhV9I3mXC5RYV3X4ig2lTpotV5rqUWlVHkUhWkEF9VClAsu6ppX82O1qbQWkqOu1qsSWcUzBTu39uk096ErDFHCZiEW5XJVWHlAS8NsI4Sy0nWzaPQLEyLPOqHJVrND6ohV3BqK9OonmmiHqWhiVu9gO_SegH8lpMjKNk8LP-kiuRe9diKLP4zyXZDn3qg380KRgm36GM-UrQdROxP7dJgrf2LiMdMZL7Nz8H-gikw8DjkSE49jmk-N-CcAAP__fn_buA">