rtype->debug_str ().c_str ());
// check bounds
- bool should_check_bounds = !ltype->is_equal (*rtype);
+ bool ltype_is_placeholder = ltype->get_kind () == TyTy::TypeKind::PLACEHOLDER;
+ bool rtype_is_placeholder = rtype->get_kind () == TyTy::TypeKind::PLACEHOLDER;
+ bool types_equal = ltype->is_equal (*rtype);
+ bool should_check_bounds
+ = !types_equal && !(ltype_is_placeholder || rtype_is_placeholder);
if (should_check_bounds)
{
if (ltype->num_specified_bounds () > 0)
--- /dev/null
+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);
+ // { dg-error "type annotations needed" "" { target *-*-* } .-1 }
+ Stream::result(&stream)
+ }
+}
+
+impl<H: StreamHasher> StreamHash<H> for u8 {
+ fn input_stream(&self, stream: &mut H::S) {
+ Stream::input(stream, &[*self]);
+ }
+}
+
+fn main() {}