]> git.lizzy.rs Git - rust.git/blob - src/test/compile-fail/borrowck-call-is-borrow-issue-12224.rs
Update compile fail tests to use isize.
[rust.git] / src / test / compile-fail / borrowck-call-is-borrow-issue-12224.rs
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.
4 //
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.
10
11 // Ensure that invoking a closure counts as a unique immutable borrow
12
13 #![feature(unboxed_closures)]
14 #![feature(box_syntax)]
15
16 type Fn<'a> = Box<FnMut() + 'a>;
17
18 struct Test<'a> {
19     f: Box<FnMut() + 'a>
20 }
21
22 fn call<F>(mut f: F) where F: FnMut(Fn) {
23     f(box || {
24     //~^ ERROR: cannot borrow `f` as mutable more than once
25         f(box || {})
26     });
27 }
28
29 fn test1() {
30     call(|mut a| {
31         a.call_mut(());
32     });
33 }
34
35 fn test2<F>(f: &F) where F: FnMut() {
36     (*f)(); //~ ERROR: cannot borrow immutable dereference of `&`-pointer `*f` as mutable
37 }
38
39 fn test3<F>(f: &mut F) where F: FnMut() {
40     (*f)();
41 }
42
43 fn test4(f: &Test) {
44     f.f.call_mut(()) //~ ERROR: cannot borrow immutable dereference of `Box` `*f.f` as mutable
45 }
46
47 fn test5(f: &mut Test) {
48     f.f.call_mut(())
49 }
50
51 fn test6() {
52     let mut f = |&mut:| {};
53     (|&mut:| {
54         f();
55     })();
56 }
57
58 fn test7() {
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
63     }, 3);
64 }
65
66 fn main() {}