| // 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)); |
| } |