#![feature(fn_traits, unboxed_closures)] use std::ops::{Fn, FnMut, FnOnce}; struct SFn { x: isize, y: isize, } impl Fn<(isize,)> for SFn { extern "rust-call" fn call(&self, (z,): (isize,)) -> isize { self.x * self.y * z } } impl FnMut<(isize,)> for SFn { extern "rust-call" fn call_mut(&mut self, args: (isize,)) -> isize { self.call(args) } } impl FnOnce<(isize,)> for SFn { type Output = isize; extern "rust-call" fn call_once(self, args: (isize,)) -> isize { self.call(args) } } struct SFnMut { x: isize, y: isize, } impl FnMut<(isize,)> for SFnMut { extern "rust-call" fn call_mut(&mut self, (z,): (isize,)) -> isize { self.x * self.y * z } } impl FnOnce<(isize,)> for SFnMut { type Output = isize; extern "rust-call" fn call_once(mut self, args: (isize,)) -> isize { self.call_mut(args) } } struct SFnOnce { x: String, } impl FnOnce<(String,)> for SFnOnce { type Output = usize; extern "rust-call" fn call_once(self, (z,): (String,)) -> usize { self.x.len() + z.len() } } fn f() { let mut s = SFn { x: 1, y: 2, }; let sp = &mut s; s(3); //~ ERROR cannot borrow `s` as immutable because it is also borrowed as mutable use_mut(sp); } fn g() { let s = SFnMut { x: 1, y: 2, }; s(3); //~ ERROR cannot borrow `s` as mutable, as it is not declared as mutable } fn h() { let s = SFnOnce { x: "hello".to_string(), }; s(" world".to_string()); s(" world".to_string()); //~ ERROR use of moved value: `s` } fn main() {} fn use_mut<T>(_: &mut T) { }