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