sorry, I misread the question. I thought you were asking about the coercion to &mut Self, but actually you are asking Pin<&mut Self>, which is irrelevant to the DerefMut impl for Pin.
as far as I know, it is not possible to poll a future directly with a Pin<Box<T>>. I suspect either you are calling a different method which happens to be named poll(), or you have a different type than Pin<Box<T>>.
can you provide more code please?
/EDIT
Pin implements DerefMut when it is safe, and Box<T> is one of the special case.
the exact condition under which it is safe is somewhat complicated, but it is an implementation detail to the standard library and the user should expect it to "just work".
pub fn subscribe_allow_rw<S: Syscalls, C: allow_rw::Config>(
driver_num: u32,
subscribe_num: u32,
buffer_num: u32,
buffer: &mut \[u8\],
) -> Pin<Box<TockSubscribe>> {
*// Pinning is necessary since we are passing a pointer to the TockSubscribe to the kernel.*
let mut f = Pin::new(Box::new(TockSubscribe::new()));
if your question is about the desugar of .await in async functions in general, I think you might be looking for the concept of "pin projection":
the anonymous Future type generated from an async function is structurally pinned, and the .await is desugared into .poll() invocation on the pin-projected sub futures.