]> git.lizzy.rs Git - rust.git/commitdiff
rustup
authorRalf Jung <post@ralfj.de>
Thu, 24 Feb 2022 15:55:40 +0000 (10:55 -0500)
committerRalf Jung <post@ralfj.de>
Thu, 24 Feb 2022 15:55:40 +0000 (10:55 -0500)
rust-version
tests/compile-fail/validity/execute_memory.rs [deleted file]
tests/compile-fail/validity/fn_ptr_offset.rs
tests/compile-fail/validity/invalid_fnptr_null.rs [new file with mode: 0644]
tests/compile-fail/validity/invalid_fnptr_uninit.rs
tests/run-pass/function_pointers.rs

index d64c1095494d5e4972ff79011f38e23a20ab472e..903f326d3fbdd9fe018243fe92ed449e6765092e 100644 (file)
@@ -1 +1 @@
-b8967b0d52a2ba5f0c9da0da03e78ccba5534e4a
+3d127e2040b57157936f5f24e114a8b4c9a505ef
diff --git a/tests/compile-fail/validity/execute_memory.rs b/tests/compile-fail/validity/execute_memory.rs
deleted file mode 100644 (file)
index 5230e7f..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#![feature(box_syntax)]
-
-fn main() {
-    let x = box 42;
-    unsafe {
-        let _f = std::mem::transmute::<Box<i32>, fn()>(x); //~ ERROR expected a function pointer
-    }
-}
index c651fbe070fbae0694a820d01c84c6020d2c2742..27d8c830ce9046f9aac04ce81bca33dd8664e1c6 100644 (file)
@@ -6,5 +6,5 @@ fn main() {
     let x : fn() = f;
     let y : *mut u8 = unsafe { mem::transmute(x) };
     let y = y.wrapping_offset(1);
-    let _x : fn() = unsafe { mem::transmute(y) }; //~ ERROR expected a function pointer
+    let _x : fn() = unsafe { mem::transmute(y) }; //~ ERROR encountered a potentially null function pointer
 }
diff --git a/tests/compile-fail/validity/invalid_fnptr_null.rs b/tests/compile-fail/validity/invalid_fnptr_null.rs
new file mode 100644 (file)
index 0000000..2270740
--- /dev/null
@@ -0,0 +1,5 @@
+#![allow(invalid_value)]
+
+fn main() {
+    let _b: fn() = unsafe { std::mem::transmute(0usize) }; //~ ERROR encountered a potentially null function pointer
+}
index dbd6711dc65a4faeadac93faf4f3da559142b40e..2d479dd319f3daf486e1f00ed1934b49a54c3275 100644 (file)
@@ -6,5 +6,5 @@ union MyUninit {
 }
 
 fn main() {
-    let _b = unsafe { MyUninit { init: () }.uninit }; //~ ERROR encountered uninitialized bytes, but expected a function pointer
+    let _b = unsafe { MyUninit { init: () }.uninit }; //~ ERROR encountered uninitialized bytes
 }
index 26a2d5a6c2a9e1a1f677ae7b749e326880e57761..dcef1fa221dcba4a8078da8165e84e5e0eb030a5 100644 (file)
@@ -1,3 +1,5 @@
+use std::mem;
+
 trait Answer {
     fn answer() -> Self;
 }
@@ -56,4 +58,13 @@ fn main() {
     assert!(return_fn_ptr(g) == g);
     assert!(return_fn_ptr(g) as unsafe fn() -> i32 == g as fn() -> i32 as unsafe fn() -> i32);
     assert!(return_fn_ptr(f) != f);
+
+    // Any non-null value is okay for function pointers.
+    unsafe {
+        let _x: fn() = mem::transmute(1usize);
+        let mut b = Box::new(42);
+        let ptr = &mut *b as *mut _;
+        drop(b);
+        let _x: fn() = mem::transmute(ptr);
+    }
 }