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