]> git.proxmox.com Git - rustc.git/blob - src/test/compile-fail/borrowck/borrowck-call-is-borrow-issue-12224.rs
New upstream version 1.12.0+dfsg1
[rustc.git] / src / test / compile-fail / borrowck / 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 type Fn<'a> = Box<FnMut() + 'a>;
14
15 struct Test<'a> {
16 f: Box<FnMut() + 'a>
17 }
18
19 // FIXME (#22405): Replace `Box::new` with `box` here when/if possible.
20 fn call<F>(mut f: F) where F: FnMut(Fn) {
21 f(Box::new(|| {
22 //~^ ERROR: cannot borrow `f` as mutable more than once
23 f((Box::new(|| {})))
24 }));
25 }
26
27 fn test1() {
28 call(|mut a| {
29 a.call_mut(());
30 });
31 }
32
33 fn test2<F>(f: &F) where F: FnMut() {
34 (*f)(); //~ ERROR: cannot borrow immutable borrowed content `*f` as mutable
35 }
36
37 fn test3<F>(f: &mut F) where F: FnMut() {
38 (*f)();
39 }
40
41 fn test4(f: &Test) {
42 f.f.call_mut(()) //~ ERROR: cannot borrow immutable `Box` content `*f.f` as mutable
43 }
44
45 fn test5(f: &mut Test) {
46 f.f.call_mut(())
47 }
48
49 fn test6() {
50 let mut f = || {};
51 (|| {
52 f();
53 })();
54 }
55
56 fn test7() {
57 fn foo<F>(_: F) where F: FnMut(Box<FnMut(isize)>, isize) {}
58 let mut f = |g: Box<FnMut(isize)>, b: isize| {};
59 // FIXME (#22405): Replace `Box::new` with `box` here when/if possible.
60 f(Box::new(|a| {
61 foo(f);
62 //~^ ERROR cannot move `f` into closure because it is borrowed
63 //~| ERROR cannot move out of captured outer variable in an `FnMut` closure
64 }), 3);
65 }
66
67 fn main() {}