From: Philip Herron Date: Tue, 30 May 2023 16:16:30 +0000 (+0100) Subject: gccrs: Fix cast site to not miss type-unifications X-Git-Tag: basepoints/gcc-15~2513 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1b34e40e5e41bdcb227b40523cd3a64c6f2fde00;p=thirdparty%2Fgcc.git gccrs: Fix cast site to not miss type-unifications When attempting casts we can try a type coercion first, this is a TryCoercion which will return a result. In the event this is ok we need to perform a true coercion so that we don't leave missing infeence variable's ununified. Fixes #2195 gcc/rust/ChangeLog: * typecheck/rust-casts.cc (TypeCastRules::check): do coercion (TypeCastRules::emit_cast_error): clang-format gcc/testsuite/ChangeLog: * rust/compile/issue-2195.rs: New test. Signed-off-by: Philip Herron --- diff --git a/gcc/rust/typecheck/rust-casts.cc b/gcc/rust/typecheck/rust-casts.cc index 8e5e65eb22c7..c9a25a033551 100644 --- a/gcc/rust/typecheck/rust-casts.cc +++ b/gcc/rust/typecheck/rust-casts.cc @@ -42,7 +42,12 @@ TypeCastRules::check () = TypeCoercionRules::TryCoerce (from.get_ty (), to.get_ty (), locus, true /*allow-autoderef*/); if (!possible_coercion.is_error ()) - return possible_coercion; + { + // given the attempt was ok we need to ensure we perform it so that any + // inference variables are unified correctly + return TypeCoercionRules::Coerce (from.get_ty (), to.get_ty (), locus, + true /*allow-autoderef*/); + } // try the simple cast rules auto simple_cast = cast_rules (); @@ -303,4 +308,4 @@ TypeCastRules::emit_cast_error () const } } // namespace Resolver -} // namespace Rust \ No newline at end of file +} // namespace Rust diff --git a/gcc/testsuite/rust/compile/issue-2195.rs b/gcc/testsuite/rust/compile/issue-2195.rs new file mode 100644 index 000000000000..c955df4f1c6b --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-2195.rs @@ -0,0 +1,8 @@ +struct A { + // { dg-warning "struct is never constructed" "" { target *-*-* } .-1 } + f: *const T, +} + +pub fn cast(a: A) { + let z = a.f as *const (); +}