]> git.lizzy.rs Git - rust.git/blob - src/test/ui/consts/min_const_fn/min_const_fn_unsafe.rs
e25dafa74d7abe588cbd8924216ebdb9c7186701
[rust.git] / src / test / ui / consts / min_const_fn / min_const_fn_unsafe.rs
1 //------------------------------------------------------------------------------
2 // OK
3 //------------------------------------------------------------------------------
4
5 const unsafe fn ret_i32_no_unsafe() -> i32 { 42 }
6 const unsafe fn ret_null_ptr_no_unsafe<T>() -> *const T { 0 as *const T }
7 const unsafe fn ret_null_mut_ptr_no_unsafe<T>() -> *mut T { 0 as *mut T }
8 const fn no_unsafe() { unsafe {} }
9
10 const fn call_unsafe_const_fn() -> i32 {
11     unsafe { ret_i32_no_unsafe() }
12 }
13 const fn call_unsafe_generic_const_fn() -> *const String {
14     unsafe { ret_null_ptr_no_unsafe::<String>() }
15 }
16 const fn call_unsafe_generic_cell_const_fn()
17     -> *const Vec<std::cell::Cell<u32>>
18 {
19     unsafe { ret_null_mut_ptr_no_unsafe::<Vec<std::cell::Cell<u32>>>() }
20 }
21
22 const unsafe fn call_unsafe_const_unsafe_fn() -> i32 {
23     unsafe { ret_i32_no_unsafe() }
24 }
25 const unsafe fn call_unsafe_generic_const_unsafe_fn() -> *const String {
26     unsafe { ret_null_ptr_no_unsafe::<String>() }
27 }
28 const unsafe fn call_unsafe_generic_cell_const_unsafe_fn()
29     -> *const Vec<std::cell::Cell<u32>>
30 {
31     unsafe { ret_null_mut_ptr_no_unsafe::<Vec<std::cell::Cell<u32>>>() }
32 }
33
34 const unsafe fn call_unsafe_const_unsafe_fn_immediate() -> i32 {
35     ret_i32_no_unsafe()
36 }
37 const unsafe fn call_unsafe_generic_const_unsafe_fn_immediate() -> *const String {
38     ret_null_ptr_no_unsafe::<String>()
39 }
40 const unsafe fn call_unsafe_generic_cell_const_unsafe_fn_immediate()
41     -> *const Vec<std::cell::Cell<u32>>
42 {
43     ret_null_mut_ptr_no_unsafe::<Vec<std::cell::Cell<u32>>>()
44 }
45
46 //------------------------------------------------------------------------------
47 // NOT OK
48 //------------------------------------------------------------------------------
49
50 const fn bad_const_fn_deref_raw(x: *mut usize) -> &'static usize { unsafe { &*x } } //~ is unsafe
51 //~^ dereferencing raw pointers in constant functions
52
53 const unsafe fn bad_const_unsafe_deref_raw(x: *mut usize) -> usize { *x }
54 //~^ dereferencing raw pointers in constant functions
55
56 const unsafe fn bad_const_unsafe_deref_raw_ref(x: *mut usize) -> &'static usize { &*x }
57 //~^ dereferencing raw pointers in constant functions
58
59 fn main() {}
60
61 const unsafe fn no_union() {
62     union Foo { x: (), y: () }
63     Foo { x: () }.y
64     //~^ unions in const fn
65 }