1 // run-pass
2 // Checks that extern fn pointers implement the full range of Fn traits.
3 
4 use std::ops::{Fn,FnMut,FnOnce};
5 
square(x: isize) -> isize6 fn square(x: isize) -> isize { x * x }
7 
call_it<F:Fn(isize)->isize>(f: &F, x: isize) -> isize8 fn call_it<F:Fn(isize)->isize>(f: &F, x: isize) -> isize {
9     f(x)
10 }
11 
call_it_mut<F:FnMut(isize)->isize>(f: &mut F, x: isize) -> isize12 fn call_it_mut<F:FnMut(isize)->isize>(f: &mut F, x: isize) -> isize {
13     f(x)
14 }
15 
call_it_once<F:FnOnce(isize)->isize>(f: F, x: isize) -> isize16 fn call_it_once<F:FnOnce(isize)->isize>(f: F, x: isize) -> isize {
17     f(x)
18 }
19 
main()20 fn main() {
21     let x = call_it(&square, 22);
22     let y = call_it_mut(&mut square, 22);
23     let z = call_it_once(square, 22);
24     assert_eq!(x, square(22));
25     assert_eq!(y, square(22));
26     assert_eq!(z, square(22));
27 }
28