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);
}
}
}
|