]> git.lizzy.rs Git - rust.git/blob - src/tools/miri/tests/pass/coerce_non_capture_closure_to_fn_ptr.rs
Auto merge of #104915 - weihanglo:update-cargo, r=ehuss
[rust.git] / src / tools / miri / tests / pass / coerce_non_capture_closure_to_fn_ptr.rs
1 static FOO: fn() = || assert_ne!(42, 43);
2 static BAR: fn(i32, i32) = |a, b| assert_ne!(a, b);
3
4 // use to first make the closure FnOnce() before making it fn()
5 fn force_once0<R, F: FnOnce() -> R>(f: F) -> F {
6     f
7 }
8 fn force_once1<T, R, F: FnOnce(T) -> R>(f: F) -> F {
9     f
10 }
11 fn force_mut0<R, F: FnMut() -> R>(f: F) -> F {
12     f
13 }
14 fn force_mut1<T, R, F: FnMut(T) -> R>(f: F) -> F {
15     f
16 }
17
18 fn main() {
19     FOO();
20     BAR(44, 45);
21     let bar: unsafe fn(i32, i32) = BAR;
22     unsafe { bar(46, 47) };
23     let boo: &dyn Fn(i32, i32) = &BAR;
24     boo(48, 49);
25
26     let f: fn() = || {};
27     f();
28     let f = force_once0(|| {}) as fn();
29     f();
30     let f = force_mut0(|| {}) as fn();
31     f();
32
33     let g: fn(i32) = |i| assert_eq!(i, 2);
34     g(2);
35     let g = force_once1(|i| assert_eq!(i, 2)) as fn(i32);
36     g(2);
37     let g = force_mut1(|i| assert_eq!(i, 2)) as fn(i32);
38     g(2);
39 }