about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2023-10-27 07:51:38 +0200
committerRalf Jung <post@ralfj.de>2023-10-27 08:02:16 +0200
commitb3f7f4dff75e3beaa7b6e60f9e5484f82fff8065 (patch)
treec7218ebf4528b665840a1d525cf10fca4ffd2316
parent31ffe48723dafd06cff75300cf37ba2f568221a1 (diff)
downloadrust-b3f7f4dff75e3beaa7b6e60f9e5484f82fff8065.tar.gz
rust-b3f7f4dff75e3beaa7b6e60f9e5484f82fff8065.zip
replace transmute by raw pointer cast
-rw-r--r--library/std/src/thread/mod.rs16
1 files changed, 8 insertions, 8 deletions
diff --git a/library/std/src/thread/mod.rs b/library/std/src/thread/mod.rs
index 7b26068c294..68ea486933a 100644
--- a/library/std/src/thread/mod.rs
+++ b/library/std/src/thread/mod.rs
@@ -545,6 +545,13 @@ impl Builder {
             scope_data.increment_num_running_threads();
         }
 
+        let main = Box::new(main);
+        #[cfg(bootstrap)]
+        let main =
+            unsafe { mem::transmute::<Box<dyn FnOnce() + 'a>, Box<dyn FnOnce() + 'static>>(main) };
+        #[cfg(not(bootstrap))]
+        let main = unsafe { Box::from_raw(Box::into_raw(main) as *mut (dyn FnOnce() + 'static)) };
+
         Ok(JoinInner {
             // SAFETY:
             //
@@ -559,14 +566,7 @@ impl Builder {
             // Similarly, the `sys` implementation must guarantee that no references to the closure
             // exist after the thread has terminated, which is signaled by `Thread::join`
             // returning.
-            native: unsafe {
-                imp::Thread::new(
-                    stack_size,
-                    mem::transmute::<Box<dyn FnOnce() + 'a>, Box<dyn FnOnce() + 'static>>(
-                        Box::new(main),
-                    ),
-                )?
-            },
+            native: unsafe { imp::Thread::new(stack_size, main)? },
             thread: my_thread,
             packet: my_packet,
         })