Pin projection
The question of whether a field inside a pinned struct is itself pinned. Rust's answer is that you must choose per field, and that the choice is part of the type's contract.
The background is that an async block compiles to a state machine that may hold references into itself, which means it must not move in memory once it has started running. Rust expresses that with a wrapper type promising that what it points at stays put. The problem appears when you implement your own future composed of other futures: to drive an inner field you have to get from the promise about the whole struct to a promise about that particular field. This is allowed, but only if you simultaneously commit to never moving the field out, never handing out an ordinary mutable reference to it, and not moving it in a destructor of your own. Since the conditions are easy to miss, the projection is almost always done with macros from the pin-project family rather than by hand.