For a subexpression c,
let GET-AWAITER(c, p) be expression-equivalent to
the series of transformations and conversions applied to c
as the operand of an await-expression in a coroutine,
resulting in lvalue e as described by [expr.await],
where p is an lvalue referring to the coroutine's promise,
which has type Promise.
This includes the invocation of
the promise type's await_transform member if any,
the invocation of the operatorco_await
picked by overload resolution if any, and
any necessary implicit conversions and materializations.
— end note]
Let GET-AWAITER(c) be
expression-equivalent to GET-AWAITER(c, q)
where q is an lvalue of
an unspecified empty class type none-such that
lacks an await_transform member, and
where coroutine_handle<none-such> behaves as
coroutine_handle<void>.
For a subexpression c
such that decltype((c)) is type C, and
an lvalue p of type Promise,
await-result- type<C, Promise> denotes
the type decltype(GET-AWAITER(c, p).await_resume()) and
await-result-type<C> denotes
the type decltype(GET-AWAITER(c).await_resume()).