58 lines
1.1 KiB
Rust
58 lines
1.1 KiB
Rust
// check-fail
|
|
//
|
|
// regression test for issue 52893
|
|
trait At<Name> {
|
|
type AtRes;
|
|
fn at(self) -> Self::AtRes;
|
|
}
|
|
|
|
trait Push<T> {
|
|
type PushRes;
|
|
fn push(self, other: T) -> Self::PushRes;
|
|
}
|
|
|
|
trait AddClass<Name, F> {
|
|
type AddRes;
|
|
fn init(self, func: F);
|
|
}
|
|
|
|
trait ToRef {
|
|
type RefRes;
|
|
fn to_ref(&self) -> Self::RefRes;
|
|
}
|
|
|
|
struct Class<P>(P);
|
|
|
|
impl<P> Class<P> {
|
|
fn with<Name, F>(self) -> <Self as AddClass<Name, F>>::AddRes
|
|
where
|
|
Self: AddClass<Name, F>,
|
|
{
|
|
todo!()
|
|
}
|
|
|
|
fn from<F>(self) -> <Self as AddClass<P, F>>::AddRes
|
|
where
|
|
Self: AddClass<P, F>,
|
|
{
|
|
todo!()
|
|
}
|
|
}
|
|
|
|
impl<F, Name, P> AddClass<Name, F> for Class<P>
|
|
where
|
|
Self: At<Name>,
|
|
<Self as At<Name>>::AtRes: Push<F>,
|
|
<<Self as At<Name>>::AtRes as Push<F>>::PushRes: ToRef<RefRes = Self> + Push<F>,
|
|
{
|
|
type AddRes = ();
|
|
|
|
fn init(self, func: F) {
|
|
let builder = self.at().push(func);
|
|
let output = builder.to_ref();
|
|
builder.push(output); //~ ERROR mismatched types [E0308]
|
|
}
|
|
}
|
|
|
|
fn main() {}
|