The Pin trait

is a standard library type that wraps pointer types and marks the data underneath as immovable.

History
Safe support for self-referential data types has been a topic of discussion for Rust since before version 1.0 was released. There were essentially two major kinds of proposals for handling this, both of which caused their own problems.

C++ addresses this with move constructors, which can be used to create immovable types by marking the move constructor private. Unfortunately, a naive transfer of C++ move constructors to Rust would make writing sound unsafe code much more complicated, because it would allow even the  assignment operator to unwind (an exception in C++ language, a panic in Rust language).

The other option was to add immovable types, which can be used to create (explicit) move constructors if, like in C++, you allow moved-from data types to have an empty representation instead of becoming inaccessible. Unfortunately, if immovable types were directly added to Rust, it would be impossible to write constructor-like functions for them, since returning from the function is a form of move. To resolve this problem, serious proposals for "immovable" types quickly converged on an approach where types were initially movable, and only become immovable when they are in some way "frozen".

The Pin type is a standard library implementation of immovable types. It was originally designed to require no language support at all, but is currently a lang type anyway because of unsound interaction with noalias.