From 444396d62056eada5dd6bf6e360aaa7377278754 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Thu, 24 Feb 2022 10:55:40 -0500 Subject: [PATCH] rustup --- rust-version | 2 +- tests/compile-fail/validity/execute_memory.rs | 8 -------- tests/compile-fail/validity/fn_ptr_offset.rs | 2 +- tests/compile-fail/validity/invalid_fnptr_null.rs | 5 +++++ tests/compile-fail/validity/invalid_fnptr_uninit.rs | 2 +- tests/run-pass/function_pointers.rs | 11 +++++++++++ 6 files changed, 19 insertions(+), 11 deletions(-) delete mode 100644 tests/compile-fail/validity/execute_memory.rs create mode 100644 tests/compile-fail/validity/invalid_fnptr_null.rs diff --git a/rust-version b/rust-version index d64c1095494d..903f326d3fbd 100644 --- a/rust-version +++ b/rust-version @@ -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 index 5230e7fdf529..000000000000 --- a/tests/compile-fail/validity/execute_memory.rs +++ /dev/null @@ -1,8 +0,0 @@ -#![feature(box_syntax)] - -fn main() { - let x = box 42; - unsafe { - let _f = std::mem::transmute::, fn()>(x); //~ ERROR expected a function pointer - } -} diff --git a/tests/compile-fail/validity/fn_ptr_offset.rs b/tests/compile-fail/validity/fn_ptr_offset.rs index c651fbe070fb..27d8c830ce90 100644 --- a/tests/compile-fail/validity/fn_ptr_offset.rs +++ b/tests/compile-fail/validity/fn_ptr_offset.rs @@ -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 index 000000000000..2270740fe149 --- /dev/null +++ b/tests/compile-fail/validity/invalid_fnptr_null.rs @@ -0,0 +1,5 @@ +#![allow(invalid_value)] + +fn main() { + let _b: fn() = unsafe { std::mem::transmute(0usize) }; //~ ERROR encountered a potentially null function pointer +} diff --git a/tests/compile-fail/validity/invalid_fnptr_uninit.rs b/tests/compile-fail/validity/invalid_fnptr_uninit.rs index dbd6711dc65a..2d479dd319f3 100644 --- a/tests/compile-fail/validity/invalid_fnptr_uninit.rs +++ b/tests/compile-fail/validity/invalid_fnptr_uninit.rs @@ -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 } diff --git a/tests/run-pass/function_pointers.rs b/tests/run-pass/function_pointers.rs index 26a2d5a6c2a9..dcef1fa221dc 100644 --- a/tests/run-pass/function_pointers.rs +++ b/tests/run-pass/function_pointers.rs @@ -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); + } }