auto result = co_await expression; // | | // | | // \ / // \ / // \/ auto&& __a = expression; if (!__a.await_ready()) { __a.await_suspend(coroutine-handle) // ...suspend/resume point... } auto result = __a.await_resume(); //================================================== co_yield i; // | | // | | // \ / // \ / // \/ co_await __promise.yield_value(i); //================================================== ... coroutine() { __coroutine_context* __context = new __coroutine_context{}; __return = __context->_promise.get_return_object(); co_await __context->_promise.initial_suspend(); ... __final_suspend_label: co_await __context->promise.final_suspend(); delete __context; }