//@ run-pass //@ pretty-expanded FIXME #23616 fn main() { let _ = test(Some(0).into_iter()); } trait Parser { type Input: Iterator; type Output; fn parse(self, input: Self::Input) -> Result<(Self::Output, Self::Input), ()>; fn chain

(self, p: P) -> Chain where Self: Sized { Chain(self, p) } } struct Token(#[allow(dead_code)] T::Item) where T: Iterator; impl Parser for Token where T: Iterator { type Input = T; type Output = T::Item; fn parse(self, _input: Self::Input) -> Result<(Self::Output, Self::Input), ()> { Err(()) } } struct Chain(#[allow(dead_code)] L, #[allow(dead_code)] R); impl Parser for Chain where L: Parser, R: Parser { type Input = L::Input; type Output = (L::Output, R::Output); fn parse(self, _input: Self::Input) -> Result<(Self::Output, Self::Input), ()> { Err(()) } } fn test(i: I) -> Result<((), I), ()> where I: Iterator { Chain(Token(0), Token(1)) .chain(Chain(Token(0), Token(1))) .chain(Chain(Token(0), Token(1))) .chain(Chain(Token(0), Token(1))) .chain(Chain(Token(0), Token(1))) .chain(Chain(Token(0), Token(1))) .chain(Chain(Token(0), Token(1))) .chain(Chain(Token(0), Token(1))) .chain(Chain(Token(0), Token(1))) .parse(i) .map(|(_, i)| ((), i)) }