diff options
| author | Oli Scherer <github35764891676564198441@oli-obk.de> | 2024-02-14 11:53:41 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-14 11:53:41 +0100 |
| commit | 93bc34073e7c116ebe409bd5ba401d4f3b184d06 (patch) | |
| tree | 7ce57efc8ab8eca833e3b421258b08437fb583aa | |
| parent | c1a80211f5a38cc08d79ec90f25d29aa4271c76a (diff) | |
| parent | a97e4afb673cd6637b814853e41026058404e778 (diff) | |
| download | rust-93bc34073e7c116ebe409bd5ba401d4f3b184d06.tar.gz rust-93bc34073e7c116ebe409bd5ba401d4f3b184d06.zip | |
Rollup merge of #121039 - cjgillot:gvn-adjust, r=compiler-errors
Correctly compute adjustment casts in GVN Fixes https://github.com/rust-lang/rust/issues/120925 r? `@oli-obk`
| -rw-r--r-- | compiler/rustc_mir_transform/src/gvn.rs | 14 | ||||
| -rw-r--r-- | tests/mir-opt/issue_120925_unsafefncast.rs | 25 |
2 files changed, 34 insertions, 5 deletions
diff --git a/compiler/rustc_mir_transform/src/gvn.rs b/compiler/rustc_mir_transform/src/gvn.rs index 8d4afd5b5dc..370f0db72cb 100644 --- a/compiler/rustc_mir_transform/src/gvn.rs +++ b/compiler/rustc_mir_transform/src/gvn.rs @@ -561,9 +561,14 @@ impl<'body, 'tcx> VnState<'body, 'tcx> { .ok()?; dest.into() } - CastKind::FnPtrToPtr - | CastKind::PtrToPtr - | CastKind::PointerCoercion( + CastKind::FnPtrToPtr | CastKind::PtrToPtr => { + let src = self.evaluated[value].as_ref()?; + let src = self.ecx.read_immediate(src).ok()?; + let to = self.ecx.layout_of(to).ok()?; + let ret = self.ecx.ptr_to_ptr(&src, to).ok()?; + ret.into() + } + CastKind::PointerCoercion( ty::adjustment::PointerCoercion::MutToConstPointer | ty::adjustment::PointerCoercion::ArrayToPointer | ty::adjustment::PointerCoercion::UnsafeFnPointer, @@ -571,8 +576,7 @@ impl<'body, 'tcx> VnState<'body, 'tcx> { let src = self.evaluated[value].as_ref()?; let src = self.ecx.read_immediate(src).ok()?; let to = self.ecx.layout_of(to).ok()?; - let ret = self.ecx.ptr_to_ptr(&src, to).ok()?; - ret.into() + ImmTy::from_immediate(*src, to).into() } _ => return None, }, diff --git a/tests/mir-opt/issue_120925_unsafefncast.rs b/tests/mir-opt/issue_120925_unsafefncast.rs new file mode 100644 index 00000000000..f80ae66efda --- /dev/null +++ b/tests/mir-opt/issue_120925_unsafefncast.rs @@ -0,0 +1,25 @@ +// Verify that we do not ICE when attempting to interpret casts between fn types. +// skip-filecheck + +static FOO: fn() = || assert_ne!(42, 43); +static BAR: fn(i32, i32) = |a, b| assert_ne!(a, b); + +fn main() { + FOO(); + + let bar: unsafe fn(i32, i32) = BAR; + + let f: fn() = || {}; + f(); + + f(); + + f(); + + let g: fn(i32) = |i| assert_eq!(i, 2); + g(2); + + g(2); + + g(2); +} |
