41 lines
929 B
Rust
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);
|
|
}
|