summaryrefslogtreecommitdiffstats
path: root/tests/ui/borrowck/issue-109271-pass-self-into-closure.rs
blob: fcd855f862d71cc4834c255b6090853ded8676cb (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| v.get());
    //~^ error: cannot borrow `v` as mutable because it is also borrowed as immutable
    v.call(|(), this: &mut S| v.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

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

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