summaryrefslogtreecommitdiffstats
path: root/src/test/ui/closures/2229_closure_analysis/filter-on-struct-member.rs
blob: bfa3ebcd6d2866806601ac0a3045d3850e899efb (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
40
41
// edition:2021

#![feature(rustc_attrs)]

struct Filter {
    div: i32,
}
impl Filter {
    fn allowed(&self, x: i32) -> bool {
        x % self.div == 1
    }
}

struct Data {
    filter: Filter,
    list: Vec<i32>,
}
impl Data {
    fn update(&mut self) {
        // The closure passed to filter only captures self.filter,
        // therefore mutating self.list is allowed.
        self.list.retain(
            #[rustc_capture_analysis]
            |v| self.filter.allowed(*v),
            //~^ ERROR: First Pass analysis includes:
            //~| ERROR: Min Capture analysis includes:
            //~| NOTE: Capturing self[Deref,(0, 0)] -> ImmBorrow
            //~| NOTE: Min Capture self[Deref,(0, 0)] -> ImmBorrow
        );
    }
}

fn main() {
    let mut d = Data { filter: Filter { div: 3 }, list: Vec::new() };

    for i in 1..10 {
        d.list.push(i);
    }

    d.update();
}