From: Philip Herron Date: Wed, 14 Jun 2023 11:11:38 +0000 (+0100) Subject: gccrs: we can't check the bounds involving empty placeholder types X-Git-Tag: basepoints/gcc-15~2466 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0f15c111397bedbc0b01c65aa9cb477d65af53fe;p=thirdparty%2Fgcc.git gccrs: we can't check the bounds involving empty placeholder types We use placeholders for assoicated types on traits but if we are unifying types against a placeholder its not possible to check the bounds as the placeholder does not have enough information yet at this point to determine if bounds will or won't be satisfied. That check will occur when associated types and generics are setup. Fixes #2036 gcc/rust/ChangeLog: * typecheck/rust-unify.cc (UnifyRules::go): dont check bounds on placeholders gcc/testsuite/ChangeLog: * rust/compile/issue-2036.rs: New test. Signed-off-by: Philip Herron --- diff --git a/gcc/rust/typecheck/rust-unify.cc b/gcc/rust/typecheck/rust-unify.cc index 42e109509174..0e62a21dc25c 100644 --- a/gcc/rust/typecheck/rust-unify.cc +++ b/gcc/rust/typecheck/rust-unify.cc @@ -151,7 +151,11 @@ UnifyRules::go () 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) diff --git a/gcc/testsuite/rust/compile/issue-2036.rs b/gcc/testsuite/rust/compile/issue-2036.rs new file mode 100644 index 000000000000..d1459752ea51 --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-2036.rs @@ -0,0 +1,36 @@ +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); + // { dg-error "type annotations needed" "" { target *-*-* } .-1 } + Stream::result(&stream) + } +} + +impl StreamHash for u8 { + fn input_stream(&self, stream: &mut H::S) { + Stream::input(stream, &[*self]); + } +} + +fn main() {}