// check-pass pub(crate) trait Parser: Sized { type Output; fn parse(&mut self, _input: &str) -> Result<(), ()> { loop {} } fn map(self, _f: F) -> Map where F: FnMut(Self::Output) -> B, { todo!() } } pub(crate) struct Chainl1(P, Op); impl Parser for Chainl1 where P: Parser, Op: Parser, Op::Output: FnOnce(P::Output, P::Output) -> P::Output, { type Output = P::Output; } pub(crate) fn chainl1(_parser: P, _op: Op) -> Chainl1 where P: Parser, Op: Parser, Op::Output: FnOnce(P::Output, P::Output) -> P::Output, { loop {} } pub(crate) struct Map(P, F); impl Parser for Map where P: Parser, F: FnMut(A) -> B, { type Output = B; } impl Parser for u32 { type Output = (); } pub fn chainl1_error_consume() { fn first(t: T, _: U) -> T { t } let _ = chainl1(1, 1.map(|_| first)).parse(""); } fn main() {}