https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101027
services+gccbugs at vasama dot org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |services+gccbugs at vasama dot org --- Comment #6 from services+gccbugs at vasama dot org --- I've just run into this bug as well. Here is another reproducer: https://godbolt.org/z/1xbjGa7b7 ``` #include <coroutine> #include <exception> #include <cstdio> struct coroutine { struct promise_type { promise_type() { fprintf(stderr, "promise_type()\n"); } ~promise_type() { fprintf(stderr, "~promise_type()\n"); } coroutine get_return_object() noexcept { return {}; } std::suspend_never initial_suspend() noexcept { return {}; } std::suspend_never final_suspend() noexcept { return {}; } void return_void() noexcept { } void unhandled_exception() noexcept { std::terminate(); } }; }; struct awaitable { bool await_ready() { bool volatile ready_volatile = true; return ready_volatile; } void await_suspend(std::coroutine_handle<void> h) { void* volatile h_volatile; h_volatile = h.address(); (void)h_volatile; } int await_resume() { return 1; } }; int main() { []() -> coroutine { fprintf(stderr, " enter task\n"); #define TEST_EXPR co_await (fprintf(stderr, " test expr\n"), awaitable()) do { fprintf(stderr, " enter loop\n"); TEST_EXPR; fprintf(stderr, " leave loop\n"); } while( false && static_cast<bool const&>(!!(TEST_EXPR)) ); fprintf(stderr, " leave task\n"); }(); } ``` This prints: ``` promise_type() enter task enter loop test expr leave loop test expr leave task ~promise_type() ``` Note "test expr" printed twice.