|  | //@ compile-flags: -Znext-solver | 
|  | //@ check-pass | 
|  |  | 
|  | // This tests checks that we update results in the provisional cache when | 
|  | // we pop a goal from the stack. | 
|  | #![feature(auto_traits)] | 
|  | auto trait Coinductive {} | 
|  | struct Foo<T>(T); | 
|  | struct Bar<T>(T); | 
|  |  | 
|  | impl<T> Coinductive for Foo<T> | 
|  | where | 
|  | Bar<T>: Coinductive | 
|  | {} | 
|  |  | 
|  | impl<T> Coinductive for Bar<T> | 
|  | where | 
|  | Foo<T>: Coinductive, | 
|  | Bar<T>: ConstrainInfer, | 
|  | {} | 
|  |  | 
|  | trait ConstrainInfer {} | 
|  | impl ConstrainInfer for Bar<u8> {} | 
|  | impl ConstrainInfer for Foo<u16> {} | 
|  |  | 
|  | fn impls<T: Coinductive>() -> T { todo!() } | 
|  |  | 
|  | fn constrain<T: ConstrainInfer>(_: T) {} | 
|  |  | 
|  | fn main() { | 
|  | // This should constrain `_` to `u8`. | 
|  | impls::<Foo<_>>(); | 
|  | } |