I'llI was thinking about the rust async infrastructure and at the heart of the API lies the [Future trait](https://doc.rust-lang.org/std/future/trait.Future.html) which is:

```rust
pub trait Future {
    type Output;

    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>;
}

```

According to the docs

> 
> The core method of future, `poll`, attempts to resolve the future into a final value. This method does not block if the value is not ready. Instead, the current task is scheduled to be woken up when it’s possible to make further progress by polling again. The context passed to the poll method can provide a `Waker`, which is a handle for waking up the current task.
> 
> 
> 

This implies that the `Context` value passed to `.poll()` (particularly the waker) needs some way to refer to the pinned future `&mut self` in order to wake it up. However `&mut` implies that the reference is not aliased. Am I misunderstanding something or is this a "special case" where aliasing `&mut` is allowed? If the latter, are there other such special cases besides `UnsafeCell`?