1 // Copyright 2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
11 // Ensure that invoking a closure counts as a unique immutable borrow
13 #![feature(unboxed_closures)]
14 #![feature(box_syntax)]
16 type Fn<'a> = Box<FnMut() + 'a>;
22 fn call<F>(mut f: F) where F: FnMut(Fn) {
24 //~^ ERROR: cannot borrow `f` as mutable more than once
35 fn test2<F>(f: &F) where F: FnMut() {
36 (*f)(); //~ ERROR: cannot borrow immutable dereference of `&`-pointer `*f` as mutable
39 fn test3<F>(f: &mut F) where F: FnMut() {
44 f.f.call_mut(()) //~ ERROR: cannot borrow immutable dereference of `Box` `*f.f` as mutable
47 fn test5(f: &mut Test) {
52 let mut f = |&mut:| {};
59 fn foo<F>(_: F) where F: FnMut(Box<FnMut(isize)>, isize) {}
60 let mut f = |&mut: g: Box<FnMut(isize)>, b: isize| {};
61 f(box |a| { //~ ERROR: cannot borrow `f` as immutable because it is also borrowed as mutable
62 foo(f); //~ ERROR: cannot move out of captured outer variable