rust/tests/ui/traits/next-solver/env-shadows-impls/ambig-env-no-shadow.rs

41 lines
929 B
Rust

//@ 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);
}