<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/62951>62951</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
clang-tidy: `modernize-loop-convert` does not work with structured binding (e.g. `std::map`)
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
e-kwsm
</td>
</tr>
</table>
<pre>
```console
$ clang-tidy --version
LLVM (http://llvm.org/):
LLVM version 15.0.7
Optimized build.
Default target: x86_64-pc-linux-gnu
Host CPU: skylake
```
Prepare the following C++ file, `/tmp/a.cpp`:
```cpp
#include <iostream>
#include <map>
int main() {
std::map<int, char> m;
m[0] = 'a';
for (auto it = m.cbegin(); it != m.cend(); ++it) {
auto [k, v] = *it;
std::cout << k << ":" << v << "\n";
}
}
```
and `/tmp/compile_commands.json`:
```json
[
{
"directory": "/tmp",
"command": "/usr/bin/clang++ -std=gnu++17 -o a.o -c a.cpp",
"file": "a.cpp",
"output": "a.o"
}
]
```
Then run `clang-tidy`
```console
1 warning generated.
/tmp/a.cpp:7:3: warning: use range-based for loop instead [modernize-loop-convert]
for (auto it = m.cbegin(); it != m.cend(); ++it) {
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(auto : m)
/tmp/a.cpp:7:7: note: FIX-IT applied suggested code changes
for (auto it = m.cbegin(); it != m.cend(); ++it) {
^
/tmp/a.cpp:8:5: note: FIX-IT applied suggested code changes
auto [k, v] = *it;
^
clang-tidy applied 2 of 2 suggested fixes.
```
which wrongly modifies the file as follows:
```diff
@@ -4,8 +4,7 @@
int main() {
std::map<int, char> m;
m[0] = 'a';
- for (auto it = m.cbegin(); it != m.cend(); ++it) {
- auto [k, v] = *it;
+ for (auto : m) {
std::cout << k << ":" << v << "\n";
}
}
```
That should be
```diff
@@ -4,8 +4,7 @@
int main() {
std::map<int, char> m;
m[0] = 'a';
- for (auto it = m.cbegin(); it != m.cend(); ++it) {
- auto [k, v] = *it;
+ for (auto [k, v] : m) {
std::cout << k << ":" << v << "\n";
}
}
```
or
```diff
@@ -4,8 +4,8 @@
int main() {
std::map<int, char> m;
m[0] = 'a';
- for (auto it = m.cbegin(); it != m.cend(); ++it) {
- auto [k, v] = *it;
+ for (auto it : m) {
+ auto [k, v] = it;
std::cout << k << ":" << v << "\n";
}
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsV0uP27YT_zT0ZSBBph6WDj74scY_QP5oDmnRW0CLY4lZihRIap3NoZ-9IC3ZXjdeJEG3pyzWEjUznNdvOCSZtaJRiEuSr0m-nbHBtdosMXo82m621_x5SYrk9F9rZbVEkmxJsiI0g1oy1URO8GeIoic0Vmh14r5__8f_gdCyda4n6YrQHaE7KZ-6WJsmfFWeHGQBgvQ4H-Z5nMSLifVb70QnviKH_SAkj0f6Fg9skA4cMw06kq7gS1l8KrKoryMp1PAlatQw6fiftg42H373YvbxWbLHKYYpsvEzPD8Y7JlBcC3CQUupj0I1sCF0TegaDkIioRvwk-jOdT2hOxbXfe8JU0Q32j13zFkqVC0HjkDSjdDWGWQdSR--xe5Yf-GEp1AOOiYUoSWhFZDFeorQOu6Np6swaSOU8z7WLTMkfYCOpGfJjuTrhORbIOkWCF0wQhcX9kEbjxobnAbhgkwX13tsJqMkXQcGnY88VPzCOeVIuBvvAIJCkq8fvVtPF_Mr4a58u4qj1oM3vyHpBh6nAaE01BKdCE_XnHyjgsCkjiy2Y_LOg2_BzRR_AWatu15I_FTrrmOK2_iz1eoVcAP7RMrPkVyCJ5RyYbB22jyf_A_OjtYooZtL9ITS0eoLycEaQnd7D8EurLixFKOQra0v9ECYLyDSwGINUQ2nmvyngVP9TtrvSenB9YO7ltP-4zax-WuJ_diiAjMon91Lo7gR-nZvmcORGeWXXYMKDXM4LfybNZeuFiRdpd7LcYYfDhbBMNVgtGcWeahqqXUPQlmHjPtK7DRHo8RXjDwnqrV6QuPOEcEbLQWSPwDAXz_wd8EFzv74IDtv6H5O_A-Udujfu3d_Ru8-Aut7KZCDHZoGrUMOtebo24Rq0L5t4MH9_OGOxyVJV_lPe_yd_eVs_mrbmgxQ0AegV3YO4gva-JXyPraibuFotGrkM3Sai4NAe9o1hERgdtw97L3OwcXhMJKyhGQJRBmhm9Jn0A8WcCKP3t9v_j_Q_V9v_9HbgB99L0K-qb3w4FzoN5X0b24TcOln8PpO8bFlDmyrB8lhj78g_SlIb-TfHN7vBVebnwG0_AVo8OAWxiB1T-HNme8_XM0zvkx5lVZshst5UeZJVRRJNmuXh31RlnXC9osq44skrbJ6T7GgZVVkrCyKmVjShKZJTot5QlOaxVW6yOZVUWRYlYwVKckS7JiQ8XTJmQlrB1wWtMrnM8n2KG24Y1Gq8AiBGQLYzszSz4n2Q2NJlkhhnb1occJJXF6dn_yBrEjuHF-KBLhG67dROGrzCEfhWrDODLUbjL9ECcX9uYrQEuMm9qpeVKY_CFezwcilv7nZ89WtEa4d9nGtu_EeN76i3ujPWDtCdyEkS-guhPx3AAAA__9Z3sVM">