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