| //@ run-pass |
| |
| const extern "C" fn foo1(val: u8) -> u8 { |
| val + 1 |
| } |
| |
| const extern "C" fn foo2(val: u8) -> u8 { |
| val + 1 |
| } |
| |
| const unsafe extern "C" fn bar1(val: bool) -> bool { |
| !val |
| } |
| |
| const unsafe extern "C" fn bar2(val: bool) -> bool { |
| !val |
| } |
| |
| #[allow(improper_ctypes_definitions)] |
| const extern "C" fn unsize(x: &[u8; 3]) -> &[u8] { |
| x |
| } |
| |
| #[allow(improper_ctypes_definitions)] |
| const unsafe extern "C" fn closure() -> fn() { |
| || {} |
| } |
| |
| const unsafe extern "C" fn use_float() -> f32 { |
| 1.0 + 1.0 |
| } |
| |
| fn main() { |
| let a: [u8; foo1(25) as usize] = [0; 26]; |
| let b: [u8; foo2(25) as usize] = [0; 26]; |
| assert_eq!(a, b); |
| |
| let bar1_res = unsafe { bar1(false) }; |
| let bar2_res = unsafe { bar2(false) }; |
| assert!(bar1_res); |
| assert_eq!(bar1_res, bar2_res); |
| |
| let _foo1_cast: extern "C" fn(u8) -> u8 = foo1; |
| let _foo2_cast: extern "C" fn(u8) -> u8 = foo2; |
| let _bar1_cast: unsafe extern "C" fn(bool) -> bool = bar1; |
| let _bar2_cast: unsafe extern "C" fn(bool) -> bool = bar2; |
| |
| unsize(&[0, 1, 2]); |
| unsafe { |
| closure(); |
| } |
| unsafe { |
| use_float(); |
| } |
| } |