mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 04:57:19 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			39 lines
		
	
	
		
			718 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			718 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use std::cell::Cell;
 | |
| use std::ops::Deref;
 | |
| use std::mem::ManuallyDrop;
 | |
| 
 | |
| union Wrap<T> { x: ManuallyDrop<T> }
 | |
| 
 | |
| impl<T> Drop for Wrap<T>  {
 | |
|     fn drop(&mut self) {
 | |
|         unsafe { std::ptr::drop_in_place(&mut *self.x as *mut T); }
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl<T> Wrap<T> {
 | |
|     fn new(x: T) -> Self {
 | |
|         Wrap { x: ManuallyDrop::new(x) }
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl<T> Deref for Wrap<T> {
 | |
|     type Target = T;
 | |
|     #[inline]
 | |
|     fn deref(&self) -> &Self::Target {
 | |
|         unsafe {
 | |
|             &self.x
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| struct C<'a>(Cell<Option<&'a C<'a>>>);
 | |
| 
 | |
| impl<'a> Drop for C<'a> {
 | |
|     fn drop(&mut self) {}
 | |
| }
 | |
| 
 | |
| fn main() {
 | |
|     let v : Wrap<C> = Wrap::new(C(Cell::new(None)));
 | |
|     v.0.set(Some(&v)); //~ ERROR: `v` does not live long enough
 | |
| }
 | 
