1 // Tests that unsafe extern fn pointers do not implement any Fn traits.
2
3 use std::ops::{Fn, FnMut, FnOnce};
4
square(x: &isize) -> isize5 extern "C" fn square(x: &isize) -> isize {
6 (*x) * (*x)
7 }
8
call_it<F: Fn(&isize) -> isize>(_: &F, _: isize) -> isize9 fn call_it<F: Fn(&isize) -> isize>(_: &F, _: isize) -> isize {
10 0
11 }
call_it_mut<F: FnMut(&isize) -> isize>(_: &mut F, _: isize) -> isize12 fn call_it_mut<F: FnMut(&isize) -> isize>(_: &mut F, _: isize) -> isize {
13 0
14 }
call_it_once<F: FnOnce(&isize) -> isize>(_: F, _: isize) -> isize15 fn call_it_once<F: FnOnce(&isize) -> isize>(_: F, _: isize) -> isize {
16 0
17 }
18
a()19 fn a() {
20 let x = call_it(&square, 22);
21 //~^ ERROR E0277
22 }
23
b()24 fn b() {
25 let y = call_it_mut(&mut square, 22);
26 //~^ ERROR E0277
27 }
28
c()29 fn c() {
30 let z = call_it_once(square, 22);
31 //~^ ERROR E0277
32 }
33
main()34 fn main() {}
35