<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/126844>126844</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang-format] comment immediately preceding `} else` is incorrectly indented
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang-format
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
rjmccall
</td>
</tr>
</table>
<pre>
clang-format appears to believe that comments preceding `} else ...` lines should be indented as if they were part of the `if` block. In fact, this is often wrong.
Comments in this position *may* end a narrative about the behavior in the `if` block and say something useful about the control flow out of the block, e.g.
```
// Check for something bad.
if (someCondition) {
// Oh no, just blow everything up.
state.reset();
// Fall through and start over.
} else {
state.proceed();
}
```
In this case, it is appropriate for the comment to be indented at the level of the inner block.
However, it is more common that these comments continue a narrative about the control flow edge that didn't enter the `if` block:
```
// Check for something bad.
if (someCondition) {
// Oh no, just blow everything up.
state.reset();
// Fall through and start over.
// Thank goodness, we're fine.
} else {
state.proceed();
}
```
In this case, it is appropriate for the comment to be indented at the level of the outer block, i.e. the same level as the initial comment on the `if`.
This behavior of clang-format can be worked around by separating the end brace and the `else`, but of course this adds an extra line and misleadingly makes the `if` block look like it ends with no `else`:
```
// Check for something bad.
if (someCondition) {
// Oh no, just blow everything up.
state.reset();
// Fall through and start over.
}
// Thank goodness, we're fine.
else {
state.proceed();
}
```
As a special case, clang-format should check whether these comments match one or the other indentation and preserve that rather than assuming that naive re-indentation is appropriate.
We saw this misbehavior on several lines in the following LLVM PR: https://github.com/llvm/llvm-project/pull/126644
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzUllGL6zYThn-NcjMc48jZJL7IRc4u4TtwPlrKob0eW2NbG1ljJDlu_n2R7Owmhy20tNAWAgEjvTPzzqOR0HvdWqKDePosnl5WOIaO3cG99nWNxqwqVtdDbdC2nxp2PQbAYSB0HgJDRUbThSB0GKDmvicbPAyOalLatiC2udi9ABlPkGWZ2OZgtCUPvuPRKKgItFVkAylAD7qB0NEVJnIEA7oAnL5EHd3E3ZXh-pzBFwsN1kHIZwid9qA9cBPIwuTYtpnIjyI_Pt_y0XZeNbDXQbMFIY89XoU8AlkFCBadw6AvBFjxGFLIijq8aHbz7u9TALQKPF7Bc0-hi7WOnprR3CnUbINjA43hCeLHpZgkEFOn7JZq9Gn-5UchT0Ke4Lmj-gwNu7sQFaq4QTcg5D5-fmarUklCliB2n0V-BFgEfujAcgzzOvoQg05AF3LXJdshS4t9wECZI09ByL2QpSgeVE5oDITO8dh2c9Eh9eVCLuV-6-4t-Kw3OK6J1L2i2L18X2h-_LJ0pkZPMVUdYitxGBwPTmOgZMBsZmrmDN0dNLPVhi5kbv5qa8ktpMxh_sdTLP09Qs9ulmQ7sxs68vROcGydtiP9DhsPnSXVLgdAaWWF3AWIubkPqBHF8b_e77d8v3Voz9AyK0vex7gTCblzBI229G9lg8dwYyNpZpSl7x7720r0C0U6aDRv4vw4BhYzvsUM30YFN_AwKWu0MaOJ3Tnm43i0CqoreBowQmXbpBmHUOWwpmT4EiU6F72Qz1DNs6Pm0XmaTUGlPKAF-jU4TDM17e21N4Rx9Jor9Hgm_9HsMsxnMPpM0VOyysOkQ6TnPu4_jurfQOqM1R_l9S-wevSA4AeqEzELsA8oLBdenaybOgrdPCHup06Poe6ALcECNqdVM9CYbq5Y5xA9cbdb1-EihRbQ-7GfqcIAFuPUcvTpXuDxCC1G_RIPwDST1Wv_zrMFHxuDZrm2l7uwYWN4ioG-fv35__DjT6I4QhfC4CM2ye9Wh26sspp7IU_GXG5_nwbHrxSv7tMwGiPkaS23281mpQ6FKosSV3RY74qyKNa7rVx1h21ebpqykiXmclvssdzgWjay3BdrwrKoVvogc_mUy7XMi43cyAypKdc57rGU1Z7UXmxy6lGbLMbP2LUr7f1Ih7Xc7jeblcGKjE_PHynveyakjA8id0h5V2PrxSY32gf_rhR0MOnp9LDx6eVtbOi-JxWtNteP30XxWMYXjK3ZOaqDub5NsNXozOFP25qK87Oxsb7LQf4WAAD__-NwNlg">