diff options
author | Philip Herron <herron.philip@googlemail.com> | 2023-05-30 17:16:30 +0100 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2023-05-30 17:03:48 +0000 |
commit | fb1259001c2554bfc622bd31c9e07f05a7f2588b (patch) | |
tree | 8194e19ad021d479c6a706383402d6dccd3f7db3 | |
parent | bc2cac14138c5276562e8df83c01646e99a117ff (diff) | |
download | gcc-fb1259001c2554bfc622bd31c9e07f05a7f2588b.zip gcc-fb1259001c2554bfc622bd31c9e07f05a7f2588b.tar.gz gcc-fb1259001c2554bfc622bd31c9e07f05a7f2588b.tar.bz2 |
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 <herron.philip@googlemail.com>
-rw-r--r-- | gcc/rust/typecheck/rust-casts.cc | 9 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/issue-2195.rs | 8 |
2 files changed, 15 insertions, 2 deletions
diff --git a/gcc/rust/typecheck/rust-casts.cc b/gcc/rust/typecheck/rust-casts.cc index 4134a7d..95db478 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 0000000..c955df4 --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-2195.rs @@ -0,0 +1,8 @@ +struct A<T> { + // { dg-warning "struct is never constructed" "" { target *-*-* } .-1 } + f: *const T, +} + +pub fn cast<T>(a: A<T>) { + let z = a.f as *const (); +} |