rust/tests/run-pass/coerce_non_capture_closure_to_fn_ptr.rs

32 lines
868 B
Rust
Raw Normal View History

static FOO: fn() = || { assert_ne!(42, 43) };
static BAR: fn(i32, i32) = |a, b| { assert_ne!(a, b) };
2018-08-27 10:08:42 -05:00
// use to first make the closure FnOnce() before making it fn()
2019-11-27 14:50:20 -06:00
fn force_once0<R, F: FnOnce() -> R>(f: F) -> F { f }
fn force_once1<T, R, F: FnOnce(T) -> R>(f: F) -> F { f }
fn force_mut0<R, F: FnMut() -> R>(f: F) -> F { f }
fn force_mut1<T, R, F: FnMut(T) -> R>(f: F) -> F { f }
2018-08-27 10:08:42 -05:00
fn main() {
FOO();
BAR(44, 45);
let bar: unsafe fn(i32, i32) = BAR;
unsafe { bar(46, 47) };
let boo: &dyn Fn(i32, i32) = &BAR;
boo(48, 49);
2018-08-27 10:08:42 -05:00
let f: fn() = ||{};
2018-08-27 10:08:42 -05:00
f();
2019-11-27 14:50:20 -06:00
let f = force_once0(||{}) as fn();
f();
let f = force_mut0(||{}) as fn();
f();
let g: fn(i32) = |i| assert_eq!(i, 2);
g(2);
2019-11-27 14:50:20 -06:00
let g = force_once1(|i| assert_eq!(i, 2)) as fn(i32);
g(2);
let g = force_mut1(|i| assert_eq!(i, 2)) as fn(i32);
g(2);
}