| // This issue tests fn_traits overloading on arity. |
| //@ run-pass |
| |
| #![feature(fn_traits)] |
| #![feature(unboxed_closures)] |
| |
| struct Foo; |
| |
| impl Fn<(isize, isize)> for Foo { |
| extern "rust-call" fn call(&self, args: (isize, isize)) -> Self::Output { |
| println!("{:?}", args); |
| (args.0 + 1, args.1 + 1) |
| } |
| } |
| |
| impl FnMut<(isize, isize)> for Foo { |
| extern "rust-call" fn call_mut(&mut self, args: (isize, isize)) -> Self::Output { |
| println!("{:?}", args); |
| (args.0 + 1, args.1 + 1) |
| } |
| } |
| |
| impl FnOnce<(isize, isize)> for Foo { |
| type Output = (isize, isize); |
| extern "rust-call" fn call_once(self, args: (isize, isize)) -> Self::Output { |
| println!("{:?}", args); |
| (args.0 + 1, args.1 + 1) |
| } |
| } |
| |
| impl Fn<(isize, isize, isize)> for Foo { |
| extern "rust-call" fn call(&self, args: (isize, isize, isize)) -> Self::Output { |
| println!("{:?}", args); |
| (args.0 + 3, args.1 + 3, args.2 + 3) |
| } |
| } |
| |
| impl FnMut<(isize, isize, isize)> for Foo { |
| extern "rust-call" fn call_mut(&mut self, args: (isize, isize, isize)) -> Self::Output { |
| println!("{:?}", args); |
| (args.0 + 3, args.1 + 3, args.2 + 3) |
| } |
| } |
| impl FnOnce<(isize, isize, isize)> for Foo { |
| type Output = (isize, isize, isize); |
| extern "rust-call" fn call_once(self, args: (isize, isize, isize)) -> Self::Output { |
| println!("{:?}", args); |
| (args.0 + 3, args.1 + 3, args.2 + 3) |
| } |
| } |
| |
| fn main() { |
| let foo = Foo; |
| assert_eq!(foo(1, 1), (2, 2)); |
| assert_eq!(foo(1, 1, 1), (4, 4, 4)); |
| } |