mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 04:57:19 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			39 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| // Demonstrate that having a trait bound causes dropck to reject code
 | |
| // that might indirectly access previously dropped value.
 | |
| //
 | |
| // Compare with run-pass/issue28498-ugeh-with-trait-bound.rs
 | |
| 
 | |
| use std::fmt;
 | |
| 
 | |
| #[derive(Debug)]
 | |
| struct ScribbleOnDrop(String);
 | |
| 
 | |
| impl Drop for ScribbleOnDrop {
 | |
|     fn drop(&mut self) {
 | |
|         self.0 = format!("DROPPED");
 | |
|     }
 | |
| }
 | |
| 
 | |
| struct Foo<T: fmt::Debug>(u32, T);
 | |
| 
 | |
| impl<T: fmt::Debug> Drop for Foo<T> {
 | |
|     fn drop(&mut self) {
 | |
|         // Use of `may_dangle` is unsound, because we access `T` fmt method when we pass
 | |
|         // `self.1` below, and thus potentially read from borrowed data.
 | |
|         println!("Dropping Foo({}, {:?})", self.0, self.1);
 | |
|     }
 | |
| }
 | |
| 
 | |
| fn main() {
 | |
|     let (last_dropped, foo0);
 | |
|     let (foo1, first_dropped);
 | |
| 
 | |
|     last_dropped = ScribbleOnDrop(format!("last"));
 | |
|     first_dropped = ScribbleOnDrop(format!("first"));
 | |
|     foo0 = Foo(0, &last_dropped); // OK
 | |
|     foo1 = Foo(1, &first_dropped);
 | |
|     //~^ ERROR `first_dropped` does not live long enough
 | |
| 
 | |
|     println!("foo0.1: {:?} foo1.1: {:?}", foo0.1, foo1.1);
 | |
| }
 | 
