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