33 lines
629 B
Rust
33 lines
629 B
Rust
|
// Tests that using fulfillment in the trait solver means that we detect that a
|
||
|
// method is impossible, leading to no ambiguity.
|
||
|
//@ check-pass
|
||
|
//@ revisions: current next
|
||
|
//@ ignore-compare-mode-next-solver (explicit revisions)
|
||
|
//@[next] compile-flags: -Znext-solver
|
||
|
|
||
|
#[derive(Default)]
|
||
|
struct W<A, B>(A, B);
|
||
|
|
||
|
trait Constrain {
|
||
|
type Output;
|
||
|
}
|
||
|
|
||
|
impl Constrain for i32 {
|
||
|
type Output = u32;
|
||
|
}
|
||
|
|
||
|
trait Impossible {}
|
||
|
|
||
|
impl<A, B> W<A, B> where A: Constrain<Output = B>, B: Impossible {
|
||
|
fn method(&self) {}
|
||
|
}
|
||
|
|
||
|
impl W<i32, u32> {
|
||
|
fn method(&self) {}
|
||
|
}
|
||
|
|
||
|
fn main() {
|
||
|
let w: W<i32, _> = W::default();
|
||
|
w.method();
|
||
|
}
|