From 51d47e8dc5a94d60ea0ef321cf81544d2908a216 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Mon, 25 Nov 2019 15:01:05 +0100 Subject: [PATCH] test closure-to-fn-ptr coercions a bit more --- .../run-pass/non_capture_closure_to_fn_ptr.rs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/tests/run-pass/non_capture_closure_to_fn_ptr.rs b/tests/run-pass/non_capture_closure_to_fn_ptr.rs index e6a5017847d..d404daef2c7 100644 --- a/tests/run-pass/non_capture_closure_to_fn_ptr.rs +++ b/tests/run-pass/non_capture_closure_to_fn_ptr.rs @@ -5,7 +5,8 @@ static BAR: fn(i32, i32) = |a, b| { assert_ne!(a, b) }; // use to first make the closure FnOnce() before making it fn() -fn magic(f: F) -> F { f } +fn magic0 R>(f: F) -> F { f } +fn magic1 R>(f: F) -> F { f } fn main() { FOO(); @@ -15,6 +16,20 @@ fn main() { let boo: &dyn Fn(i32, i32) = &BAR; boo(48, 49); - let f = magic(||{}) as fn(); + let f: fn() = ||{}; f(); + let f = magic0(||{}) as fn(); + f(); + + let g: fn(i32) = |i| assert_eq!(i, 2); + g(2); + let g = magic1(|i| assert_eq!(i, 2)) as fn(i32); + g(2); + + // FIXME: This fails with "invalid use of NULL pointer" + //let h: fn() -> ! = || std::process::exit(0); + //h(); + // FIXME: This does not even compile?!? + //let h = magic0(|| std::process::exit(0)) as fn() -> !; + //h(); } -- 2.44.0