| use std::marker::PhantomData; | |
| fn a() { | |
| WrongImpl::foo(0i32); | |
| //~^ ERROR the associated function or constant `foo` exists for struct `SafeImpl<_, RawImpl<_>>`, but its trait bounds were not satisfied | |
| //~| ERROR the trait bound `RawImpl<_>: Raw<_>` is not satisfied | |
| } | |
| fn b() { | |
| WrongImpl::<()>::foo(0i32); | |
| //~^ ERROR the trait bound `RawImpl<()>: Raw<()>` is not satisfied | |
| //~| ERROR trait bounds were not satisfied | |
| } | |
| fn c() { | |
| CorrectImpl::foo(0i32); | |
| } | |
| pub trait Raw<T: ?Sized> { | |
| type Value; | |
| } | |
| pub type WrongImpl<T> = SafeImpl<T, RawImpl<T>>; | |
| pub type CorrectImpl<T> = SafeImpl<[T], RawImpl<T>>; | |
| pub struct RawImpl<T>(PhantomData<T>); | |
| impl<T> Raw<[T]> for RawImpl<T> { | |
| type Value = T; | |
| } | |
| pub struct SafeImpl<T: ?Sized, A: Raw<T>>(PhantomData<(A, T)>); | |
| impl<T: ?Sized, A: Raw<T>> SafeImpl<T, A> { | |
| pub fn foo(value: A::Value) {} | |
| } | |
| fn main() {} |