mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 13:04:42 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			40 lines
		
	
	
		
			737 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
		
			737 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
| // Check that we handle evaluating `wf` predicates correctly.
 | |
| 
 | |
| // check-pass
 | |
| 
 | |
| struct X<T: B>(T)
 | |
| where
 | |
|     T::V: Clone;
 | |
| 
 | |
| fn hide<T>(t: T) -> impl Sized {
 | |
|     t
 | |
| }
 | |
| 
 | |
| trait A {
 | |
|     type U;
 | |
| }
 | |
| 
 | |
| impl<T> A for T {
 | |
|     type U = T;
 | |
| }
 | |
| 
 | |
| trait B {
 | |
|     type V;
 | |
| }
 | |
| 
 | |
| impl<S: A<U = T>, T> B for S {
 | |
|     type V = T;
 | |
| }
 | |
| 
 | |
| fn main() {
 | |
|     // Evaluating `typeof(x): Sized` requires
 | |
|     //
 | |
|     // - `wf(typeof(x))` because we use a projection candidate.
 | |
|     // - `<i32 as B>::V: Clone` because that's a bound on the trait.
 | |
|     // - `<i32 as B>::V` normalizes to `_#1` where `<i32 as A>::U == _#1`
 | |
|     //
 | |
|     // This all works if we evaluate `<i32 as A>::U == _#1` before
 | |
|     // `<i32 as B>::V`, but we previously had the opposite order.
 | |
|     let x = hide(X(0));
 | |
| }
 | 
