2024-03-10 21:25:32 -05:00
|
|
|
//@ revisions: current next
|
|
|
|
//@[next] compile-flags: -Znext-solver
|
|
|
|
//@ ignore-compare-mode-next-solver (explicit revisions)
|
|
|
|
//@[current] check-pass
|
|
|
|
//@[current] known-bug: #57893
|
2023-04-18 20:30:21 -05:00
|
|
|
|
|
|
|
// Should fail. Because we see an impl that uses a certain associated type, we
|
|
|
|
// type-check assuming that impl is used. However, this conflicts with the
|
|
|
|
// "implicit impl" that we get for trait objects, violating coherence.
|
|
|
|
|
|
|
|
trait Object<U> {
|
|
|
|
type Output;
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T: ?Sized, U> Object<U> for T {
|
|
|
|
type Output = U;
|
|
|
|
}
|
|
|
|
|
|
|
|
fn foo<T: ?Sized, U>(x: <T as Object<U>>::Output) -> U {
|
|
|
|
x
|
|
|
|
}
|
|
|
|
|
|
|
|
#[allow(dead_code)]
|
|
|
|
fn transmute<T, U>(x: T) -> U {
|
|
|
|
foo::<dyn Object<U, Output = T>, U>(x)
|
2024-03-10 21:25:32 -05:00
|
|
|
//[next]~^ ERROR type annotations needed: cannot satisfy `<dyn Object<U, Output = T> as Object<U>>::Output == T`
|
2023-04-18 20:30:21 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {}
|