mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 13:04:42 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			35 lines
		
	
	
		
			980 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			35 lines
		
	
	
		
			980 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
| // RPITITs don't have variances in their GATs, so they always relate invariantly
 | |
| // and act as if they capture all their args.
 | |
| // To fix this soundly, we need to make sure that all the trait header args
 | |
| // remain captured, since they affect trait selection.
 | |
| 
 | |
| #![feature(precise_capturing_in_traits)]
 | |
| 
 | |
| fn eq_types<T>(_: T, _: T) {}
 | |
| 
 | |
| trait TraitLt<'a: 'a> {
 | |
|     fn hello() -> impl Sized + use<Self>;
 | |
|     //~^ ERROR `impl Trait` captures lifetime parameter, but it is not mentioned in `use<...>` precise captures list
 | |
| }
 | |
| fn trait_lt<'a, 'b, T: for<'r> TraitLt<'r>> () {
 | |
|     eq_types(
 | |
|         //~^ ERROR lifetime may not live long enough
 | |
|         //~| ERROR lifetime may not live long enough
 | |
|         <T as TraitLt<'a>>::hello(),
 | |
|         <T as TraitLt<'b>>::hello(),
 | |
|     );
 | |
| }
 | |
| 
 | |
| trait MethodLt {
 | |
|     fn hello<'a: 'a>() -> impl Sized + use<Self>;
 | |
| }
 | |
| fn method_lt<'a, 'b, T: MethodLt> () {
 | |
|     eq_types(
 | |
|         T::hello::<'a>(),
 | |
|         T::hello::<'b>(),
 | |
|     );
 | |
|     // Good!
 | |
| }
 | |
| 
 | |
| fn main() {}
 | 
