

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;
}