From d2290c425314a391d4b8eef846d0d0633d6b296d Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 28 Dec 2025 16:24:55 +0100 Subject: [PATCH] fix ManuallyDrop::into_inner aliasing (Miri) issues --- library/core/src/mem/manually_drop.rs | 4 +++- src/tools/miri/tests/pass/issues/issue-miri-4793.rs | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 src/tools/miri/tests/pass/issues/issue-miri-4793.rs diff --git a/library/core/src/mem/manually_drop.rs b/library/core/src/mem/manually_drop.rs index 74f917bcf1cc..ca008a82ee6f 100644 --- a/library/core/src/mem/manually_drop.rs +++ b/library/core/src/mem/manually_drop.rs @@ -200,7 +200,9 @@ pub const fn new(value: T) -> ManuallyDrop { #[rustc_const_stable(feature = "const_manually_drop", since = "1.32.0")] #[inline(always)] pub const fn into_inner(slot: ManuallyDrop) -> T { - slot.value.into_inner() + // Cannot use `MaybeDangling::into_inner` as that does not yet have the desired semantics. + // SAFETY: We know this is a valid `T`. `slot` will not be dropped. + unsafe { (&raw const slot).cast::().read() } } /// Takes the value from the `ManuallyDrop` container out. diff --git a/src/tools/miri/tests/pass/issues/issue-miri-4793.rs b/src/tools/miri/tests/pass/issues/issue-miri-4793.rs new file mode 100644 index 000000000000..ccbff462f995 --- /dev/null +++ b/src/tools/miri/tests/pass/issues/issue-miri-4793.rs @@ -0,0 +1,3 @@ +fn main() { + let _ = std::panic::catch_unwind(|| Box::::from("...")); +}