<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/109542>109542</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Clang miscompilation producing double destroy coro local variable
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
kelbon
</td>
</tr>
</table>
<pre>
https://godbolt.org/z/KqqK1aqv6
```cpp
struct inplace_generator_promise {
using handle_type = std::coroutine_handle<inplace_generator_promise>;
handle_type get_return_object() noexcept {
return handle_type::from_promise(*this);
}
std::suspend_always yield_value(int) noexcept {
return {};
}
static constexpr std::suspend_never initial_suspend() noexcept {
return {};
}
std::suspend_always final_suspend() const noexcept {
return {};
}
static constexpr void return_void() noexcept {
}
[[noreturn]] static void unhandled_exception() {
throw;
}
};
struct inplace_generator {
using promise_type = inplace_generator_promise;
using handle_type = std::coroutine_handle<promise_type>;
handle_type handle;
inplace_generator(std::coroutine_handle<promise_type> handle) noexcept : handle(handle) {
}
~inplace_generator() {
handle.destroy();
}
};
struct dctor {
dctor() {
std::cout << "CREATED\n";
}
dctor(dctor&&) = delete;
void operator=(dctor&&) = delete;
~dctor() {
std::cout << "DELETED\n";
}
};
inplace_generator starter(){
// double destroyed, firstly after throw, second in handle.destroy(), must not be destroyed in handle.destroy after it
dctor d;
co_yield {};
throw 0;
}
[[gnu::noinline]] void bug_reproducer() {
starter().handle.resume();
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykVk2PozgQ_TXmYk0EJpDmwCEJyWX2tNo7MnaFeNfYtD8ykz3Mb1_xkYQ09MdqpKhpGfu9V1WvClNrRa0AcpTsUFIE1LuzNvk_ICutgkrza352rrUo3iJyRORYa15p6Vba1Igc_0Xk-P319XtEXy8pCgsUbse_aTj8WNtO160znjksVCspg7IGBYY6bcrW6EZYwGizG3Zi7K1QNT5TxSWU7toCRnGBreOdmHjLtNHeCQXlsAXF-3dhUXxA8W4qBD8B1-BKA84bVerqb2AOkRdEMqw0_GTQuqksjIedU4BB0cno5s7YAWzdWVhEsjs3xmhTPMu4x2O9bUHxksof9GrxVYDk5YVK32EJ5T7V061tio-5qBMMM62sg5-tmZMruIDBQgknqCzH1a8k4yvky4GehJpR9QqXCD9lWwjyogUfD5bd_--HM0Hp-2Gn9HAOJQVKiht0D-jVUH9eDjBCqxH4KT3ubPSPh9BHVibyP26NeUuMFnv0xAe-_41umtJ81kC3Q89bZroQefkfjDfUp2LF2_vyy-P9JEcz4_1akvF8aABacbDO6OvwetHL71WNszeV6hdmPJPgfRfLHsV7jAjZ_3nY_nUoULJXiJBlX98Qx2fa_7K-ihwkuGmxe4fqdow2Lr547NeyaozfFV4c_jh8LHyasrm3raPGwUh5Zxw-NZhrX0nAY1WAI7LHJ2Gsk1dMTw7M2F1kjy0wrTgWarmUZI8b308Uh6sJ4vzACCzcI_ahthzFO_xYZLrsJ_RsFPWScPiwybMdh7lSKz-kU2mhpFAwDpi-bpWvSwOt0dwzWPLQJGWrUb0B6xt4Y9y31LdvcsDzmGdxRgPIow1Js_U6itLgnPN0s04Jg9OabU7hJkzCLIqBVXHKEoiqTSByEpJ1mJEoellHSbpiLIUoe0kJhHxzyiK0DqGhQq6kvDTdJSEQ1nrIozBL1iSQtAJp-8sGIUxSVXeuSYrA5N2Bb5WvLVqHUlhnHxBOOAn5vtuOG2GZblohaTdx8ZClbrI9mwV30wVLzajEF2oErSQE3si3txnhzr5aMd0gcuz4xse31ujhGnDs9VtEjmMIl5z8FwAA___Xs8ZL">