File: issue-55492-borrowck-migrate-scans-parents.rs

package info (click to toggle)
rustc 1.87.0%2Bdfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 925,564 kB
  • sloc: xml: 158,127; python: 36,039; javascript: 19,761; sh: 19,737; cpp: 18,981; ansic: 13,133; asm: 4,376; makefile: 710; perl: 29; lisp: 28; ruby: 19; sql: 11
file content (69 lines) | stat: -rw-r--r-- 1,799 bytes parent folder | download | duplicates (15)
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// rust-lang/rust#55492: errors detected during MIR-borrowck's
// analysis of a closure body may only be caught when AST-borrowck
// looks at some parent.

// transcribed from borrowck-closures-unique.rs
mod borrowck_closures_unique {
    pub fn e(x: &'static mut isize) {
        static mut Y: isize = 3;
        let mut c1 = |y: &'static mut isize| x = y;
        //~^ ERROR is not declared as mutable
        unsafe {
            c1(&mut Y);
        }
    }
}

mod borrowck_closures_unique_grandparent {
    pub fn ee(x: &'static mut isize) {
        static mut Z: isize = 3;
        let mut c1 = |z: &'static mut isize| {
            let mut c2 = |y: &'static mut isize| x = y;
            //~^ ERROR is not declared as mutable
            c2(z);
        };
        unsafe {
            c1(&mut Z);
        }
    }
}

// adapted from mutability_errors.rs
mod mutability_errors {
    pub fn capture_assign_whole(x: (i32,)) {
        || {
            x = (1,);
            //~^ ERROR is not declared as mutable
        };
    }
    pub fn capture_assign_part(x: (i32,)) {
        || {
            x.0 = 1;
            //~^ ERROR is not declared as mutable
        };
    }
    pub fn capture_reborrow_whole(x: (i32,)) {
        || {
            &mut x;
            //~^ ERROR is not declared as mutable
        };
    }
    pub fn capture_reborrow_part(x: (i32,)) {
        || {
            &mut x.0;
            //~^ ERROR is not declared as mutable
        };
    }
}

fn main() {
    static mut X: isize = 2;
    unsafe {
        borrowck_closures_unique::e(&mut X);
    }

    mutability_errors::capture_assign_whole((1000,));
    mutability_errors::capture_assign_part((2000,));
    mutability_errors::capture_reborrow_whole((3000,));
    mutability_errors::capture_reborrow_part((4000,));
}