diff options
author | Philip Herron <herron.philip@googlemail.com> | 2023-05-30 17:16:30 +0100 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2024-01-16 18:37:22 +0100 |
commit | 1b34e40e5e41bdcb227b40523cd3a64c6f2fde00 (patch) | |
tree | dc95df4c5494d97d41605aaad1d231fbc4e2a914 /gcc | |
parent | 56e29f4d5de8134db5f7772adc13154f3efccf43 (diff) | |
download | gcc-1b34e40e5e41bdcb227b40523cd3a64c6f2fde00.zip gcc-1b34e40e5e41bdcb227b40523cd3a64c6f2fde00.tar.gz gcc-1b34e40e5e41bdcb227b40523cd3a64c6f2fde00.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>
Diffstat (limited to 'gcc')
-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 8e5e65e..c9a25a0 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 (); +} |