<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/102606>102606</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang] [coroutines] impossible happens, incorect behavior (bug)
</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>
Appears, that compiler passes .done() handle into await_suspend, which should never happen.
Returning handle of coroutine from its final_suspend should be correct and may be used to "continue" coroutine and free memory
https://godbolt.org/z/oeh5Tooxb
```cpp
#include <coroutine>
#include <iostream>
struct transfer_control_to {
std::coroutine_handle<> waiter;
bool await_ready() const noexcept { return false; }
std::coroutine_handle<> await_suspend(std::coroutine_handle<> h) noexcept {
if (h.done()) {
std::cout << "IMPOSSIBLE HAPPEN" << std::endl;
h.destroy();
return std::noop_coroutine();
}
return waiter;
}
static void await_resume() noexcept {}
};
struct task_promise {
std::coroutine_handle<void> waiter;
static constexpr std::suspend_always initial_suspend() noexcept { return {}; }
static void return_void() {}
auto get_return_object() {
return std::coroutine_handle<task_promise>::from_promise(*this);
}
void unhandled_exception() noexcept {}
auto final_suspend() noexcept { return transfer_control_to{waiter}; }
};
struct task {
using promise_type = task_promise;
using handle_type = std::coroutine_handle<promise_type>;
handle_type handle_;
constexpr task(handle_type handle) noexcept : handle_(handle) {}
void start_and_detach() {
handle_.promise().waiter = handle_;
handle_.resume();
handle_ = nullptr;
}
};
task foo() { co_return; }
void bar() {
auto t = foo();
t.start_and_detach();
}
int main() { bar(); }
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyEVt2OozgTfRrnpjQRMfnjgouku6NvpG93Rzt7jwwugneMjWzT09mnX9n8p7OZVosgqDpVdc6xMbNWXBViSnZnsntdsdZV2qQ_UOZarXLNb-mpaZAZS-gLuIo5KHTdCIkGGmYtWlhzrZDQI6EJVExxiSCU08B-MuEy29oGFffZPytRVGAr3UoOCt_RQMWaBtWaRK8kOv2JrjVKqOsAo0sotNGtEwqhNLoG4SyUQjE54A5wOfpQg4UDpjjU7OYftRY5OA2E0kIrJ1SLhNIZqI8tDSLUWGtz6_rorpVzjSXxidALoZer5rmWbq3NldDLP4ReNFa7v7T-yOdJZB91_0XTLJ7TWKhCthyBxC9jfRK_PXovtHUGWT29DlfrTFs4cIYpW6LJ_EhGy8wPeDh3MWAd903Hp7FI1rFJ4hcSv4EXBQ2Jz3NkgFxr2StmkPFbr2ehlXWgNH4U2DhfBkxQCUomLZL4DOTwOoD8qvadI46_iq98C_PiQyEAUQKhx2rmPR-7CFn00zoIoC_eC19_-_bH9-9fz_9_g_-dvn17-92bon895qDicqQJqjVH64zuiZlehL-ekzFXad1kk8qfU2akjdl3ysCSWeZEAe9a8FEl29bDsltwNGT5m6XMg4GY_ZE1RtfC4pyyZ3L4yk_s0_cX7IIfjZmwerUzJn-ymwWhhBPT8n3Q_0BHP8q9wyYeurgsdNbBLKbvM1jrNFzRExbCdf43Fm6WcC_DMxbmzPnFGeL8xjQ-9LgnVwm7VHw2Qui9VR0mz7rBhVbPpOzHWOx8T6h7sEOQw7mX7o7Tpy6ZE9RavzP3c2bu1vit6hWWlNxFd0NOwc-4nSMHbu8sNsfq7-9jJvv5rvz-8ClnSVl8GqGG4P_wUVDNOmZcxhTPODpWVI9c1OOt54ZI1h33gYP73seM-YpebBZ9QMhWrZSNe7hLfFYySFhqPfUJhe4XwsIEYbqcmc8DBd-5UHoEmoq79WNKpj6WNArloGZCzRoaqy5dOXxHVzyNeRInbIXp5kBjGu239LCq0vx44Ie84HRb7I-448VxcyhynmzzpNzR6LASKY3oNjpGyYbSQ0TXjG2ObFPukyTZlXlJyTbCmgm5lvK99h_2lbC2xXQT0X20X0mWo7ThXERpIZm6Ekr9EcmkPuFL3l4t2UZSWGcnCCecDIepLmP3Cv5-cLv1D0TdaGtFLrE__oSjlVCFDseXHCv2LrTx37e8vRKarFoj07vjiHBVm68LXRN68cX7ny-N0d3-dgnDWEIv_TzvKf03AAD__2lsCDU">