<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/57861>57861</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
miscompilation with coroutine since 15.0.0: function has no ret call
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
adrianimboden
</td>
</tr>
</table>
<pre>
godbolt: https://godbolt.org/z/YveThKxn5
```cpp
#include <coroutine>
#include <string>
#include <variant>
using TestType = std::string; // bug does not happen on e.g. int
struct async_generator {
struct promise_type {
//does not happen if this type is simple (pointer, or variant without TestType)
std::variant<std::monostate, TestType, promise_type*> continuation_;
promise_type* result_receiver_ = nullptr;
auto initial_suspend() {
return std::suspend_never{};
}
auto final_suspend() noexcept {
struct Suspension {
promise_type* this_;
auto await_ready() noexcept {
return false;
}
auto await_suspend(std::coroutine_handle<>) noexcept {
if (this_->result_receiver_) {
std::coroutine_handle<promise_type>::from_promise(*this_->result_receiver_).resume();
}
if (std::holds_alternative<promise_type*>(this_->continuation_)) {
this_->continuation_ = std::monostate{};
}
}
auto await_resume() noexcept {
}
};
return Suspension{this};
}
auto get_return_object() noexcept {
return async_generator{this};
}
auto yield_value(TestType) noexcept {
return std::suspend_always{};
}
void unhandled_exception() {
std::terminate();
}
};
~async_generator() noexcept {
std::coroutine_handle<promise_type>::from_promise(*controller_).destroy();
}
promise_type* controller_;
};
static auto bar() -> async_generator {
co_yield "";
}
void foo() {
asm("nop");//not strictly necessary, but bug is better visible that way
bar();
}
```
clang++-14 -O3 -std=c++20 -stdlib=libc++
```asm
foo(): # @foo()
nop
ret
```
clang++-15 -O3 -std=c++20 -stdlib=libc++
```asm
foo(): # @foo()
nop
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzNV02TsjgQ_jV4SWkhCOiBw4zOe3kP72HnsicqkCjZigmVBOdlf_12AvKhOONs7WEpRe0k3U8__UGbS9KkJ0lyyY0XvqDSmErDFy_4Aa9uYSXVCX79De8_L_S9_PlbRJ5_8PyX7h777auoqk4ShEwUvCYUeeG-kErWhgnqhW9z69ooJk4PFi9YMSzMsOrutYYT6J1q895Udt8BaUMs8PDlqu4VtV6gvD4hIqlGQhpU4qqiAkmB6Oq0QgxUj_TC2bowCOtGFNmJCqqwkQp5yWu7juDq9lRKnpmmmXEAxhvs1Zq-tcqOyJRMI3cGPjU7VxxOB9tKAhKqvGCPwF7nNPpgpgTqeke9YDc10zvd07TvRWcppDbYUKt00LCfIPcC2PqGCikgQDU2TIoMqJtauTmAnr0U1TU3maIFZReqMhcnUXNeGdUbmZrCtZEQFGYY5pmuNbBGgB5w_J7j1oSplRgFvz2SCQoG7YnkcOeOlT0yfWTizrCQ9HdBKzOPoEuHP9wRDfzNb5vj0eZC9oCICSr8gZnlEZPmKUw37Bwx1_SOhi_omAEw0NLz3dd2VmJBOFjZ21J9GiFUBKhzRCzh4G3GPIz7NAKPwUwoB2Bu3xGEWbfi-Hz5DMDKys7txt1DFp9gcvC3R1xKTnSGOZS-gOK73EF25TlmaFqpAOgZhuZPT9vm0C7mq2bW0W8yMEnmgdQncmXW4iOYXdoPJQlqLQXfbQYnanFaXZnM_6KFeQpuZ_3mGfIvITSMcpJdMK8tV6PnwHMg7voi5h-40d9rjBfJCKpFW1Mka81aVj_py71hyOwz9FTzqH4mgR2DGkvfbsn8Kg7_QUuwpaIk510TIEC9ks2MFzOs3Tb6sa7evztfbfWxoo17jq9O2rL9fCApZObSBDpLYF9jCyP1LoxHKefChvXZiQMhK6fFuehmGDu-2JGqMLxBAvqi1lg1do7IYTKxsxUMMjk1EGh0YZrlMNCYEsPwgpvBQO_PDLrr-DgGW3AMM1wAGF6X6w1a_grR0gX1ULTSwHcCznKQwb0T36i0fjlJ77edcr-4YABF3sYfjkxSyzI0EUCpfeLIjDvR_9Kd3siCpus4DpN1FCTxgqQh2YU7vDDMcJpCWhfyXDHuHiFuQEV9jcE8KwqK1tHKX_kW2bEWhdtXYjsHW6pQgTlf1IqnN_81QFOdr0A5_OD8cv1YQi21rfcH07qmGr5EyTZeL8o0xP4uxJuEHEmwy_EmX2McHndku90l8THOFxznlOvUi1696LBgaeAHgb-De-gnUbzCCd5ukij0YxKvo5gAS_SMGV9Zw_Zfz0KlDgNkuYZFzrTRwyLWmp0EpVf9ULilVCkmdhRn51wSKhYOdOoQ_wMg_rhL">