| // 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 `?1t` where `<i32 as A>::U == ?1t` | |
| // | |
| // This all works if we evaluate `<i32 as A>::U == ?1t` before | |
| // `<i32 as B>::V`, but we previously had the opposite order. | |
| let x = hide(X(0)); | |
| } |