summaryrefslogtreecommitdiff
path: root/tests/ui/borrowck/issue-109271-pass-self-into-closure.fixed
blob: 4a8831dab95676dc6dcf708ecfea7857bdc64028 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// run-rustfix
#![allow(unused)]
struct S;

impl S {
    fn call(&mut self, f: impl FnOnce((), &mut Self)) {
        // change state or something ...
        f((), self);
        // change state or something ...
    }

    fn get(&self) {}
    fn set(&mut self) {}
}

fn main() {
    let mut v = S;

    v.call(|(), this: &mut S| this.get());
    //~^ error: cannot borrow `v` as mutable because it is also borrowed as immutable
    v.call(|(), this: &mut S| this.set());
    //~^ error: cannot borrow `v` as mutable more than once at a time
    //~| error: cannot borrow `v` as mutable more than once at a time

    v.call(|(), this: &mut S| {
        //~^ error: cannot borrow `v` as mutable more than once at a time
        //~| error: cannot borrow `v` as mutable more than once at a time

        _ = this;
        this.set();
        this.get();
        S::get(&this);

        use std::ops::Add;
        let v = 0u32;
        _ = v + v;
        _ = v.add(3);
    });
}