summaryrefslogtreecommitdiffstats
path: root/tests/ui/issues/issue-12028.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/issues/issue-12028.rs')
-rw-r--r--tests/ui/issues/issue-12028.rs38
1 files changed, 38 insertions, 0 deletions
diff --git a/tests/ui/issues/issue-12028.rs b/tests/ui/issues/issue-12028.rs
new file mode 100644
index 000000000..7503766ff
--- /dev/null
+++ b/tests/ui/issues/issue-12028.rs
@@ -0,0 +1,38 @@
+// 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() {}