// Test an example where we fail to infer the type parameter H. This // is because there is really nothing constraining it. At one time, we // would infer based on the where clauses in scope, but that no longer // works. trait Hash { fn hash2(&self, hasher: &H) -> u64; } trait Stream { fn input(&mut self, bytes: &[u8]); fn result(&self) -> u64; } trait StreamHasher { type S : Stream; fn stream(&self) -> Self::S; } trait StreamHash: Hash { fn input_stream(&self, stream: &mut H::S); } impl Hash for u8 { fn hash2(&self, hasher: &H) -> u64 { let mut stream = hasher.stream(); self.input_stream(&mut stream); //~ ERROR type annotations needed Stream::result(&stream) } } impl StreamHash for u8 { fn input_stream(&self, stream: &mut H::S) { Stream::input(stream, &[*self]); } } fn main() {}