// Copyright 2014 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. // 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 required Stream::result(&stream) } } impl StreamHash for u8 { fn input_stream(&self, stream: &mut H::S) { Stream::input(stream, &[*self]); } } fn main() {}