It's clear when I have the desugared case of fn foo() -> impl Future<Output=R>: Here the return value is a future. But it's not so clear (to me) what the return value of async fn foo() is (due to the sugaring).
I'm entirely asking about terminology here. I understand what really happens, but I'm just unsure which wording to use.
The one wording I would outright rule out is "blocks until". That's simply not true. The whole point of async is to prevent blocking.
I find "foo().await returns" confusing, because it's not a function call expression, it's an await expression. Only functions "return"; other expressions might yield a value, too, but IMO it's not correct to call that "returning".
"waits until" is… OK, although it's very generic, and it might imply to some people that it's blocking, which it is not.
"pending until" and "the future returned is ready" seem the best formulations, since the states represented by Pollare called Pending and Ready. I can't decide between these two, because "pending until" is less verbose, so it may be preferable for the sake of practicality, but it's negative, so "the future is ready" might be preferable from a purely linguistic perspective.