use std::cell::Cell; use std::ops::Deref; use std::mem::ManuallyDrop; union Wrap { x: ManuallyDrop } impl Drop for Wrap { fn drop(&mut self) { unsafe { std::ptr::drop_in_place(&mut *self.x as *mut T); } } } impl Wrap { fn new(x: T) -> Self { Wrap { x: ManuallyDrop::new(x) } } } impl Deref for Wrap { type Target = T; #[inline] fn deref(&self) -> &Self::Target { unsafe { &self.x } } } struct C<'a>(Cell>>); impl<'a> Drop for C<'a> { fn drop(&mut self) {} } fn main() { let v : Wrap = Wrap::new(C(Cell::new(None))); v.0.set(Some(&v)); //~ ERROR: `v` does not live long enough }