Not all executors can implement this. For example, a single-threaded executor will get here, block on the completion of…some other future that it can no longer execute because it is blocked here (e.g., blocking on consuming from a channel while some other future would be allowed to produce a value but can no longer be scheduled).
Feels like a highway-to-deadlocksville footgun to me if it were so accessible.
I don't think that an extension trait is the right call here, but we could definitely have a std::future::block_on function, like the popular pollster crate provides.
Usually you start a new executor, move the future to it, then block. If you ask the current executor, it may have to do other things to satisfy the final await and need to get a Pending from it so it is "allowed" to work on other futures in the meantime.