https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116775
Bug ID: 116775
Summary: C++20 Coroutine await_suspend is unexpectedly executed
when using in __builtin_constant_p
Product: gcc
Version: 14.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: sunsijie at buaa dot edu.cn
Target Milestone: ---
```
#include <coroutine>
struct awaitable {
awaitable(int n) : delay{n} {}
constexpr bool await_ready() const noexcept { return false; }
auto await_suspend(std::coroutine_handle<> h) const {
*((int*)0) = 42;
return false;
}
int await_resume() const noexcept {
return delay;
}
int delay;
};
struct Task {
struct promise_type {
promise_type() = default;
Task get_return_object() { return {}; }
std::suspend_never initial_suspend() { return {}; }
std::suspend_always final_suspend() noexcept { return {}; }
void unhandled_exception() {}
};
};
Task foo() noexcept {
(void)__builtin_constant_p((co_await awaitable{10}));
}
//call foo
int main() {
foo();
}
```
__builtin_constant_p is described as `The expression is not evaluated,
side-effects are discarded.`, but in above example, the await_suspend is
executed unexpectedly.