<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/139818>139818</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang] constant evaluation of `for` loop does not run destructor for condition variable
</td>
</tr>
<tr>
<th>Labels</th>
<td>
good first issue,
clang:frontend,
accepts-invalid,
c++23
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
zygoloid
</td>
</tr>
</table>
<pre>
If a condition variable is declared in the second clause of a three-clause `for` loop, clang doesn't destroy it when constant-evaluating the loop. For example:
```c++
struct X {
constexpr ~X() noexcept(false) { throw "oops"; }
constexpr operator bool() {
return b;
}
bool b;
};
constexpr bool f() {
for (bool b = false; X x = {b}; b = true) {}
return true;
}
static_assert(f());
```
Clang treats this as constant, but the destructor for `x` throws an exception.
It looks like the problem is that we fail to call `IterScope.destroy()` [here](https://github.com/llvm/llvm-project/blob/5f41928689125667cf645835fa9fefee97511d8a/clang/lib/AST/ExprConstant.cpp#L5742), when terminating a loop iteration because the condition evaluated to `false`.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyUVE2P4zYM_TXyhZhAlvx58CGZNMACvW0Pcytkm47VVSRDojOZHvrbC8nODDA9FRBgmyIf6cdHqhD01SJ2rDyx8pyplWbnu78_rs44PWa9Gz-6HxMoGJwdNWln4a68Vr1B0AFGHIzyOIK2QDNCwOgHg1FrQHAxkGaP-LJbWMUn51nFwTi3MPEaXe0VRofBMlETjBjIuw_QBO8z2pg3kLL0gndlVkXaXlOmGH-Ai_OAD3VbDDJ5ZPzIKr6dgYlTPPwYyK8DwRuwOn7CBomPxcM_b0w0TLRgHT4GXIiJZlImYLSx-hSLd-_AhHBuCUwIJk_A6vM3GLegV-Q89M6ZHfGZDMAjrd5Cz-RmecZH56c12tLLF2i6nr6hTc4DE80WCkyeYStXnuANHsnA6lO_we0e5Nfn_zxT7yWlm8_8kSlFevhThYA-UbFlj2fzepLL-PE19Y08KgpAsw6gwmezYmP7lVKjUkPXIdKTqq_4I_Y_MRtAWdiY184eYgp-_EGxub8CGP0LE8TiXW_wFgVHsyJ4R5iUNkAOBmVMxPxB6H8ObsHDLqC99IoDK08zemTlmYlmJlpClIq4MHG5aprX_jC4GxMXY-7Px8vi3V84EBOX3rieiUs5FXkrmqppc1FWVT1MVVE2spxUO-GE2NZlno-NYuKSFB2BdAw8_vyDictvj8W_7uQchmVhQv5e1oVI7L5uSif0N203haukb9AUhRWHrschDVCk42sU95nAMVIRZyuJoeKHbOzk2MpWZdjldVHnjRQ8z-ZOyl5WohinUvJCYc_bvqxkjbzNSz6VmOlOcFHyMi84LzjPD_VYc1X0Uoq-qnAaWcHxprQ5RKIOzl8zHcKKXS7bJm8yo3o0Ie0TIa7OjTBpHwiSU5wg8cqE2DiSx8k7S2jHzws1RDGEF23vyugv-z7OQkZLec58l_rUr9fACm50oPBVEGkyaaVtacrzpzCfjEXy3PRtHaUtBNYR-NV-1-1_91-2etP9bz0lHgITl52veyf-DQAA__-oQLza">