| //@ revisions: current next | |
| //@ ignore-compare-mode-next-solver (explicit revisions) | |
| //@[next] compile-flags: -Znext-solver | |
| //@[next] known-bug: #92505 | |
| //@[current] check-pass | |
| trait Trait { | |
| type Assoc; | |
| } | |
| impl<T> Trait for T { | |
| type Assoc = T; | |
| } | |
| fn impls_trait<T: Trait>() {} | |
| fn foo<T>() | |
| where | |
| <T as Trait>::Assoc: Trait, | |
| { | |
| // Trying to use `<T as Trait>::Assoc: Trait` to prove `T: Trait` | |
| // requires normalizing `<T as Trait>::Assoc`. We do not normalize | |
| // using impl candidates if there's a where-bound for that trait. | |
| // | |
| // We therefore check whether `T: Trait` is proven by the environment. | |
| // For that we try to apply the `<T as Trait>::Assoc: Trait` candidate, | |
| // trying to normalize its self type results in overflow. | |
| // | |
| // In the old solver we eagerly normalize the environment, ignoring the | |
| // unnormalized `<T as Trait>::Assoc: Trait` where-bound when normalizing | |
| // `<T as Trait>::Asosc` | |
| impls_trait::<T>(); | |
| } | |
| fn main() {} |