|  | //@ compile-flags: -Znext-solver | 
|  | //@ check-pass | 
|  | #![feature(rustc_attrs)] | 
|  |  | 
|  | #[rustc_coinductive] | 
|  | trait Trait<T> {} | 
|  | impl<'a, 'b, T> Trait<T> for (&'a (), &'b ()) | 
|  | where | 
|  | 'b: 'a, | 
|  | &'a (): Trait<T>, | 
|  | {} | 
|  |  | 
|  | impl Trait<i32> for &'static () {} | 
|  | impl<'a> Trait<u32> for &'a () | 
|  | where | 
|  | for<'b> (&'a (), &'b ()): Trait<u32>, | 
|  | {} | 
|  |  | 
|  |  | 
|  | fn impls_trait<T: Trait<U>, U>() {} | 
|  |  | 
|  | fn main() { | 
|  | // This infers to `impls_trait::<(&'static (), &'static ()), i32>();` | 
|  | // | 
|  | // In the first attempt we have 2 candidates for `&'a (): Trait<_>` | 
|  | // and we get ambiguity. The result is therefore ambiguity with a `'b: 'a` | 
|  | // constraint. The next attempt then uses that provisional result when | 
|  | // trying to apply `impl<'a> Trait<u32> for &'a ()`. This means we get a | 
|  | // `for<'b> 'b: 'a` bound which fails the leak check. Because of this we | 
|  | // end up with a single impl for `&'a (): Trait<_>` which infers `_` to `i32` | 
|  | // and succeeds. | 
|  | impls_trait::<(&(), &()), _>(); | 
|  | } |