pub trait Main { type Item; type Out0: Support; type Out1: Support; type Out2: Support; type Out3: Support = bool>; type Out4: Support = T>; type Out5: Support = &'static ()>; type Out6: for<'a> Support = &'a ()>; type Out7: Support = u32> + Unrelated; type Out8: Unrelated + Protocol; type Out9: FnMut(i32) -> bool + Clone; type Out10<'q>: Support = ()>; type Out11: for<'r, 's> Helper = &'s (), B<'r> = ()>; type Out12: for<'w> Helper = std::borrow::Cow<'w, str>, A<'w> = bool>; type Out13: for<'fst, 'snd> Aid<'snd, Result<'fst> = &'fst mut str>; type Out14; fn make(_: F, _: impl FnMut(&str) -> bool) where F: FnOnce(u32) -> String, Self::Out2<()>: Protocol; } pub trait Support { type Item; type Output<'a>; type Produce; } pub trait Protocol { type Q0; type Q1; } pub trait Unrelated {} pub trait Helper { type A<'q>; type B<'q>; } pub trait Aid<'src> { type Result<'inter: 'src>; } pub trait Implementee { type Alias where String: From; } pub struct Implementor; impl Implementee for Implementor { type Alias = T where String: From, // We will check that this bound doesn't get turned into an item bound since // associated types in impls are not allowed to have any. Self::Alias: From>; }