Yeah, I said that as if there were 2 different documentations
; there is, of course, one single documentation, the one at the root of ::std::pin combined with the documentation of the associated unsafe functions of ::std::pin::Pin.
The documentation states that, if T : !Unpin, then T's address cannot change if comes from PinPtr<T>. That documentation, imho, requires less thought from a consumer point of view, since they can just go: “great, I somehow have this magic invariant, I don’t need to think too much about it”; whereas a Pin creator needs to think about more complex questions, such as the life of T after death no longer being PinPtr<T>.
Which, by the way, if I have understood that correctly (which I may not), is the dangerous thing to avoid with PinPtr<T> : once PinPtr<T> has existed, no code should have access to &mut T (since it could move T and thus cause UB if T : !UnPin), which is a problem because of <T as Drop>::drop : fn(&mut T). Obviously, it should not be forbidden to have Drop + !UnPin, it’s just that it should now be seen as an unsafe combination, thus requiring special care and attention from the programmer.
Notation
PinPtr<T> = Pin<impl Deref<Target = T>> where T : !UnPin