File: const-extern-fn.rs

package info (click to toggle)
rustc 1.85.0%2Bdfsg2-3
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 893,176 kB
  • sloc: xml: 158,127; python: 35,830; javascript: 19,497; cpp: 19,002; sh: 17,245; ansic: 13,127; asm: 4,376; makefile: 1,051; lisp: 29; perl: 29; ruby: 19; sql: 11
file content (55 lines) | stat: -rw-r--r-- 1,127 bytes parent folder | download | duplicates (15)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//@ 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();
    }
}