summaryrefslogtreecommitdiffstats
path: root/src/test/ui/pattern/bindings-after-at/borrowck-pat-ref-mut-twice.rs
blob: 99739c7bce0412091437e44209c35053875ca428 (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
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// Test that `ref mut x @ ref mut y` and varieties of that are not allowed.

fn main() {
    struct U;

    fn u() -> U { U }

    fn f1(ref mut a @ ref mut b: U) {}
    //~^ ERROR cannot borrow value as mutable more than once at a time
    fn f2(ref mut a @ ref mut b: U) {}
    //~^ ERROR cannot borrow value as mutable more than once at a time
    fn f3(
        ref mut a @ [
        //~^ ERROR cannot borrow value as mutable more than once at a time
            [ref b @ .., _],
            [_, ref mut mid @ ..],
            ..,
            [..],
        ] : [[U; 4]; 5]
    ) {}
    fn f4_also_moved(ref mut a @ ref mut b @ c: U) {}
    //~^ ERROR cannot borrow value as mutable more than once at a time
    //~| ERROR cannot move out of value because it is borrowed
    //~| ERROR borrow of moved value

    let ref mut a @ ref mut b = U;
    //~^ ERROR cannot borrow value as mutable more than once at a time
    drop(a);
    let ref mut a @ ref mut b = U;
    //~^ ERROR cannot borrow value as mutable more than once at a time
    //~| ERROR cannot borrow value as mutable more than once at a time
    drop(b);
    let ref mut a @ ref mut b = U;
    //~^ ERROR cannot borrow value as mutable more than once at a time

    let ref mut a @ ref mut b = U;
    //~^ ERROR cannot borrow value as mutable more than once at a time
    *a = U;
    let ref mut a @ ref mut b = U;
    //~^ ERROR cannot borrow value as mutable more than once at a time
    //~| ERROR cannot borrow value as mutable more than once at a time
    *b = U;

    let ref mut a @ (
    //~^ ERROR cannot borrow value as mutable more than once at a time
        ref mut b,
        [
            ref mut c,
            ref mut d,
            ref e,
        ]
    ) = (U, [U, U, U]);

    let ref mut a @ (
        //~^ ERROR cannot borrow value as mutable more than once at a time
            ref mut b,
            [
                ref mut c,
                ref mut d,
                ref e,
            ]
        ) = (u(), [u(), u(), u()]);

    let a @ (ref mut b, ref mut c) = (U, U);
    //~^ ERROR borrow of moved value
    let mut val = (U, [U, U]);
    let a @ (b, [c, d]) = &mut val; // Same as ^--
    //~^ ERROR borrow of moved value

    let a @ &mut ref mut b = &mut U;
    //~^ ERROR borrow of moved value
    let a @ &mut (ref mut b, ref mut c) = &mut (U, U);
    //~^ ERROR borrow of moved value

    match Ok(U) {
        ref mut a @ Ok(ref mut b) | ref mut a @ Err(ref mut b) => {
            //~^ ERROR cannot borrow value as mutable more than once at a time
            //~| ERROR cannot borrow value as mutable more than once at a time
        }
    }
    match Ok(U) {
        ref mut a @ Ok(ref mut b) | ref mut a @ Err(ref mut b) => {
            //~^ ERROR cannot borrow value as mutable more than once at a time
            //~| ERROR cannot borrow value as mutable more than once at a time
            *b = U;
        }
    }
    match Ok(U) {
        ref mut a @ Ok(ref mut b) | ref mut a @ Err(ref mut b) => {
            //~^ ERROR cannot borrow value as mutable more than once at a time
            //~| ERROR cannot borrow value as mutable more than once at a time
            //~| ERROR cannot borrow value as mutable more than once at a time
            //~| ERROR cannot borrow value as mutable more than once at a time
            *a = Err(U);

            // FIXME: The binding name value used above makes for problematic diagnostics.
            // Resolve that somehow...
        }
    }
    match Ok(U) {
        ref mut a @ Ok(ref mut b) | ref mut a @ Err(ref mut b) => {
            //~^ ERROR cannot borrow value as mutable more than once at a time
            //~| ERROR cannot borrow value as mutable more than once at a time
            //~| ERROR cannot borrow value as mutable more than once at a time
            //~| ERROR cannot borrow value as mutable more than once at a time
            drop(a);
        }
    }
}