#![allow(dead_code, deprecated, unused_variables, unused_mut)] use std::marker::PhantomPinned; use std::pin::Pin; use std::pin::pin; #[derive(Default)] struct AddrTracker { prev_addr: Option, _pin: PhantomPinned, } impl AddrTracker { fn check_for_move(self: Pin<&mut Self>) { let current_addr = &*self as *const Self as usize; match self.prev_addr { None => { let self_data_mut = unsafe { self.get_unchecked_mut() }; self_data_mut.prev_addr = Some(current_addr); } Some(prev_addr) => assert_eq!(prev_addr, current_addr), } } } fn main() { let tracker = AddrTracker::default(); let mut ptr_to_pinned_tracker: Pin<&mut AddrTracker> = pin!(tracker); ptr_to_pinned_tracker.as_mut().check_for_move(); ptr_to_pinned_tracker.as_mut().check_for_move(); }