<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/123347>123347</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
17 Regression: over optimization at -O2
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
NewSigma
</td>
</tr>
</table>
<pre>
godbolt: https://godbolt.org/z/4xEEz6fsY
```
#include <iostream>
#include <coroutine>
#include <utility>
#include <vector>
struct Promise {
std::vector<int> obj;
~Promise() {
std::cout << "~Promise: " << obj.data() << std::endl;
}
auto get_return_object() { return std::coroutine_handle<Promise>::from_promise(*this); };
std::suspend_never initial_suspend() noexcept { return {}; }
std::suspend_never final_suspend() noexcept { return {}; }
std::suspend_always yield_value(std::vector<int> b) noexcept {
obj = std::move(b);
return {};
}
void return_void() noexcept {}
void unhandled_exception() {}
};
struct coro {
using promise_type = Promise;
std::vector<int> arr;
std::coroutine_handle<Promise> handle;
coro(std::coroutine_handle<Promise> handle_) noexcept {
handle = handle_;
arr = std::move(handle_.promise().obj);
}
};
coro fn() {
co_yield std::vector<int>(1);
}
int main(int argc, char** argv) {
coro cr = fn();
std::cout << "main: " << cr.arr.data() << std::endl;
cr.handle.resume();
return 0;
}
```
The code works fine using clang 16, but it breaks using 17 ~ trunk.
Possible wrong result(-O2):
main: 0x61c7ada362f0
~Promise: 0x61c7ada362f0
Expected result(-O0):
main: 0x61c7ada362f0
~Promise: 0
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysVk2P4jgQ_TXmYnWU2JDAIYc0Dced0e5e9hQ5ThHc7djIH9D0YX77yvmAQDejXmlRJIKr_OpV1XMZZq1oFECOFs9o8TJj3u21yf-A01-iadms0vU5b3RdaekQLfDeuYNFtEBki8h2METaNIhsPxDZzt83m490Z_9BcRGeNB6euECECsWlrwEjuhbaOgOsRXTzyca10d4JBV8ZvRNSuPNXpiNwp81giQvrjOcO_zS6FRYwyp5RXGDr6sCfFqP3WiiH6Abr6hXR534rxhj_GjYiskRkNW4fPhcUrr0LsRFdY0TIZRMtws_RoqvXqGaOjVj96gUEVC372AEbZS9XFsw7jRtwpQHnjSp19QrcXTnhfn1KaCheuWeqloDo-sJp07vsjG7LwyS7wu2FRWSF6HMXnd5Wynp7AFWXCo5gsFDCCSbLYXWgojS8czi4KadQsg5tSOkR4k6o_wmPyRM7W3wWIOvyyKQP-T3seHUfaNJgXb1iRF-uIVp9DGBVX6aJ5z25my6Gt6MW9eBVhvcvMrxz9qrvXV32LkKriQp7eYyxrkIPnZ9k4a1QDR7aXLrzAbqELmKYSP1hhZgx92L4rb7wuDaCB-9pC76zu_xNW3qPLpHR-aYZzJgv2zY4R1PVr6Jw5Kft_FzarqY79WkGcF12IntYOkSWyQX7cqKFcrhlIuCFV2Yajsga8z0ziBSIFGHpeB_KaMz7tEYmV8qPBlEX5XYIcRMxY74_h7iJ-rJFBqxv4T70IPz4JsfpwI-Lv_eAua4Bn7R5s-Ggw6BLLplqcJKG9CvvsHC4MsDe7GBPMvwLO-PVW9RD_dTWikoCPhmtGhwoyTAHn36QjlXwGZOO39OEZ6xmNCW7QGU6lj8ZUVxs3g_AHdRT2Pg_wqK4mNU5rVd0xWaQJxnNEkIXdDnb5ySlyZyxmi6ShPOULKr5jqU7yuqYpBmPZyInMVnESZIl82S5WEbL3bKiqzldpatFTCqG5jG0TMhIymMbLtyZsNZDnhBK59lMsgqk7W5xQhSccGdFhIRL3eRh01PlG4vmsRTW2SuME04GtvhPaAxYG2YNLbAOg1kfnGjFBwsDCDOHn36QmTcyv_sXINzeVxHXLSLbgDt8PR2M7i-rbcfGIrId6B5z8m8AAAD__5jKgc0">