1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
//@ compile-flags: -Znext-solver
//@ check-pass
// If a trait goal is proven using the environment, we discard
// impl candidates when normalizing. However, in this example
// the env candidates start as ambiguous and end up not applying,
// so normalization should succeed later on.
trait Trait<T>: Sized {
type Assoc: From<Self>;
}
impl<T, U> Trait<U> for T {
type Assoc = T;
}
fn mk_assoc<T: Trait<U>, U>(t: T, _: U) -> <T as Trait<U>>::Assoc {
t.into()
}
fn generic<T>(t: T) -> T
where
T: Trait<u32>,
T: Trait<i16>,
{
let u = Default::default();
// at this point we have 2 ambig env candidates
let ret: T = mk_assoc(t, u);
// now both env candidates don't apply, so we're now able to
// normalize using this impl candidates. For this to work
// the normalizes-to must have remained ambiguous above.
let _: u8 = u;
ret
}
fn main() {
assert_eq!(generic(1), 1);
}
|