//@ 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: Sized { type Assoc: From; } impl Trait for T { type Assoc = T; } fn mk_assoc, U>(t: T, _: U) -> >::Assoc { t.into() } fn generic(t: T) -> T where T: Trait, T: Trait, { 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); }