mirror of https://github.com/rust-lang/rust
74 lines
1.1 KiB
Rust
74 lines
1.1 KiB
Rust
//@ check-pass
|
|
|
|
pub trait FirstTrait {
|
|
type Item;
|
|
type Extra: Extra<(), Error = Self::Item>;
|
|
}
|
|
|
|
trait SecondTrait {
|
|
type Item2;
|
|
}
|
|
|
|
trait ThirdTrait: SecondTrait {
|
|
type Item3;
|
|
}
|
|
|
|
trait FourthTrait {
|
|
type Item4;
|
|
}
|
|
|
|
impl<First> SecondTrait for First
|
|
where
|
|
First: FirstTrait,
|
|
{
|
|
type Item2 = First::Extra;
|
|
}
|
|
|
|
impl<Second, T> ThirdTrait for Second
|
|
where
|
|
Second: SecondTrait<Item2 = T>,
|
|
{
|
|
type Item3 = T;
|
|
}
|
|
|
|
impl<S, Third: ?Sized> FourthTrait for Third
|
|
where
|
|
Third: ThirdTrait<Item3 = S>,
|
|
{
|
|
type Item4 = S;
|
|
}
|
|
|
|
pub trait Extra<Request> {
|
|
type Error;
|
|
}
|
|
|
|
struct ImplShoulExist<D, Req> {
|
|
_gen: (D, Req),
|
|
}
|
|
|
|
impl<D, Req> ImplShoulExist<D, Req>
|
|
where
|
|
D: FourthTrait,
|
|
D::Item4: Extra<Req>,
|
|
<D::Item4 as Extra<Req>>::Error: Into<()>,
|
|
{
|
|
fn access_fn(_: D) {
|
|
todo!()
|
|
}
|
|
}
|
|
|
|
impl<D, Req> Extra<Req> for ImplShoulExist<D, Req> {
|
|
type Error = ();
|
|
}
|
|
|
|
pub fn broken<MS>(ms: MS)
|
|
where
|
|
MS: FirstTrait,
|
|
MS::Item: Into<()>,
|
|
{
|
|
// Error: Apparently Balance::new doesn't exist during MIR validation
|
|
ImplShoulExist::<MS, ()>::access_fn(ms);
|
|
}
|
|
|
|
fn main() {}
|