use std::cell::Cell; use std::marker::PhantomPinned; use std::pin::Pin; struct MyType<'a>(Cell>>, PhantomPinned); impl<'a> Clone for &'a mut MyType<'a> { //~^ ERROR E0751 fn clone(&self) -> &'a mut MyType<'a> { self.0.take().unwrap() } } fn main() { let mut unpinned = MyType(Cell::new(None), PhantomPinned); let bad_addr = &unpinned as *const MyType<'_> as usize; let mut p = Box::pin(MyType(Cell::new(Some(&mut unpinned)), PhantomPinned)); // p_mut1 is okay: it does not point to the bad_addr let p_mut1: Pin<&mut MyType<'_>> = p.as_mut(); assert_ne!(bad_addr, &*p_mut1 as *const _ as usize); // but p_mut2 does point to bad_addr! this is unsound let p_mut2: Pin<&mut MyType<'_>> = p_mut1.clone(); assert_eq!(bad_addr, &*p_mut2 as *const _ as usize); }