// rust-lang/rust#30786: the use of `for<'b> &'b mut A: Stream Option; } // Example stream pub struct Repeat(u64); impl<'a> Stream for &'a mut Repeat { type Item = &'a u64; fn next(self) -> Option { Some(&self.0) } } pub struct Map { stream: S, func: F, } impl<'a, A, F, T> Stream for &'a mut Map where &'a mut A: Stream, F: FnMut(<&'a mut A as Stream>::Item) -> T, { type Item = T; fn next(self) -> Option { match self.stream.next() { Some(item) => Some((self.func)(item)), None => None, } } } pub struct Filter { stream: S, func: F, } impl<'a, A, F, T> Stream for &'a mut Filter where for<'b> &'b mut A: Stream, // <---- BAD F: FnMut(&T) -> bool, { type Item = <&'a mut A as Stream>::Item; fn next(self) -> Option { while let Some(item) = self.stream.next() { if (self.func)(&item) { return Some(item); } } None } } pub trait StreamExt where for<'b> &'b mut Self: Stream { fn map(self, func: F) -> Map where Self: Sized, for<'a> &'a mut Map: Stream, { Map { func: func, stream: self, } } fn filter(self, func: F) -> Filter where Self: Sized, for<'a> &'a mut Filter: Stream, { Filter { func: func, stream: self, } } fn count(mut self) -> usize where Self: Sized, { let mut count = 0; while let Some(_) = self.next() { count += 1; } count } } impl StreamExt for T where for<'a> &'a mut T: Stream { } fn main() { let source = Repeat(10); let map = source.map(|x: &_| x); //[nll]~^ ERROR higher-ranked subtype error //[migrate]~^^ ERROR implementation of `Stream` is not general enough //[migrate]~| NOTE `Stream` would have to be implemented for the type `&'0 mut Map //[migrate]~| NOTE but `Stream` is actually implemented for the type `&'1 //[migrate]~| NOTE implementation of `Stream` is not general enough let filter = map.filter(|x: &_| true); //[nll]~^ ERROR higher-ranked subtype error //[nll]~| ERROR higher-ranked subtype error //[nll]~| ERROR higher-ranked subtype error //[nll]~| ERROR higher-ranked subtype error let count = filter.count(); // Assert that we still have a valid stream. //[nll]~^ ERROR higher-ranked subtype error //[nll]~| ERROR higher-ranked subtype error //[nll]~| ERROR higher-ranked subtype error //[nll]~| ERROR higher-ranked subtype error }