mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-30 20:44:34 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			48 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| // This test used to be part of a run-pass test, but revised outlives
 | |
| // rule means that it no longer compiles.
 | |
| 
 | |
| #![allow(unused_variables)]
 | |
| 
 | |
| trait Trait<'a> {
 | |
|     fn long(&'a self) -> isize;
 | |
|     fn short<'b>(&'b self) -> isize;
 | |
| }
 | |
| 
 | |
| fn object_invoke1<'d>(x: &'d dyn Trait<'d>) -> (isize, isize) { loop { } }
 | |
| 
 | |
| trait MakerTrait {
 | |
|     fn mk() -> Self;
 | |
| }
 | |
| 
 | |
| fn make_val<T:MakerTrait>() -> T {
 | |
|     MakerTrait::mk()
 | |
| }
 | |
| 
 | |
| impl<'t> MakerTrait for Box<dyn Trait<'t>+'static> {
 | |
|     fn mk() -> Box<dyn Trait<'t>+'static> { loop { } }
 | |
| }
 | |
| 
 | |
| pub fn main() {
 | |
|     let m : Box<dyn Trait+'static> = make_val();
 | |
|     assert_eq!(object_invoke1(&*m), (4,5));
 | |
|     //~^ ERROR `*m` does not live long enough
 | |
| 
 | |
|     // the problem here is that the full type of `m` is
 | |
|     //
 | |
|     //   Box<Trait<'m>+'static>
 | |
|     //
 | |
|     // Here `'m` must be exactly the lifetime of the variable `m`.
 | |
|     // This is because of two requirements:
 | |
|     // 1. First, the basic type rules require that the
 | |
|     //    type of `m`'s value outlives the lifetime of `m`. This puts a lower
 | |
|     //    bound `'m`.
 | |
|     //
 | |
|     // 2. Meanwhile, the signature of `object_invoke1` requires that
 | |
|     //    we create a reference of type `&'d Trait<'d>` for some `'d`.
 | |
|     //    `'d` cannot outlive `'m`, so that forces the lifetime to be `'m`.
 | |
|     //
 | |
|     // This then conflicts with the dropck rules, which require that
 | |
|     // the type of `m` *strictly outlives* `'m`. Hence we get an
 | |
|     // error.
 | |
| }
 | 
