d9ab4ff9a3
Remove blanket check for existence of other errors before emitting "type annotation needed" errors, and add some eager checks to avoid adding obligations when they refer to types that reference `[type error]` in order to reduce unneded errors.
39 lines
933 B
Rust
39 lines
933 B
Rust
// 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<H> {
|
|
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<H: StreamHasher>: Hash<H> {
|
|
fn input_stream(&self, stream: &mut H::S);
|
|
}
|
|
|
|
impl<H: StreamHasher> Hash<H> 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<H: StreamHasher> StreamHash<H> for u8 {
|
|
fn input_stream(&self, stream: &mut H::S) {
|
|
Stream::input(stream, &[*self]);
|
|
}
|
|
}
|
|
|
|
fn main() {}
|