<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/145787>145787</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang-tidy] Check request: bugprone-invalidated-std-erase
</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 dangerous usages of `std::erase`.
```
void example() {
std::vector<int> values{1, 1, 2, 3, 1, 4};
std::erase(values, values.front()); // WARNING
}
```
Correct way to write the same logic is to make a copy before erase:
```
void example() {
std::vector<int> values{1, 1, 2, 3, 1, 4};
const auto copy = values.front();
std::erase(values, copy); // OK
}
```
BTW, is it possible to provide such fixit hint? I never seen a Clang Tidy's fixit that provides such transformation.
In C++23 mode this check will definitely provide fixit:
```
void example() {
std::vector<int> values{1, 1, 2, 3, 1, 4};
std::erase(values, auto{values.front()}); // OK
}
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyslF9r4zgUxT-N_HJJkCX_SR78ECebpSx0YSn0WbaubW1lKSvJbrOffpBjOkPbGTpQEDLGvkdHv3O5wnvVG8SK5DXJT4mYwmBdJdH8bx2jNGmsvFb3iNKDgHbA9gnCIAI8K62hU0aCFKZHZycPkxc9erAdkIL6IAk_EH5AJzySgm4JPcRV0HXRw2yVBHwR40UjYTvC9kDKmtADAMCrwIxtsI7wozKB8D9gFnpCT8o6JewIy8bixl9fM1KeCF-E3thgu7WaHVedbeesCbfT4-I1AGFnws7wePjn_u7-z2i6PL2xTujhaJ3DNsCzuEKw8OxUQAgDghcjgra9akH5-GkUTxjx2csVGuysQ7jZ4Z8n8jU4AKC1xgcQU7A3Q4SfPkLB3-XwnmCsf8Ps779-hqt-eIw1yoMKcLHeq0ZjpHNxdlYSwU_tAJ16UQGG5W5nuAODMzrwiAYEHLUwPTwoeSWs9Ou_SzuuGv4mEpwwvrNuFEFZszbenYEjYTVhNeMwWhmzUn7t6aWdJXbKqID6-uppOeJ3Yvqyxv01-RgfKesPcitPn04kkRWXe74XCVZpmdPdrmScJkMlWVHsMdt3rRRUNm2ZtRmnuM_yMt2nvE1UxSjLacFylnKe0-1u15alzFlBU8zzIiUZxVEovdV6HrfW9YnyfsIqzfJyVyZaNKj9MnQYa2Oqm7CkyuIQclWs2jRT70lGtfLBf9cJKuhlXP1Qlp_guMTo8L8JfQwMmqm_OGtwo8wstJIioNz4IDcLzGRyuhpCuPhIeAHVqzBMzba1I2HneNz62Fyc_RfbQNh5uYMn7LxeY67YtwAAAP__mP2OJA">