]> git.lizzy.rs Git - rust.git/blob - tests/ui/borrowck/borrowck-use-mut-borrow.rs
Auto merge of #106646 - Amanieu:ilp32-object, r=Mark-Simulacrum
[rust.git] / tests / ui / borrowck / borrowck-use-mut-borrow.rs
1 #[derive(Copy, Clone)]
2 struct A { a: isize, b: isize }
3
4 struct B { a: isize, b: Box<isize> }
5
6
7
8 fn var_copy_after_var_borrow() {
9     let mut x: isize = 1;
10     let p = &mut x;
11     drop(x); //~ ERROR cannot use `x` because it was mutably borrowed
12     *p = 2;
13 }
14
15 fn var_copy_after_field_borrow() {
16     let mut x = A { a: 1, b: 2 };
17     let p = &mut x.a;
18     drop(x); //~ ERROR cannot use `x` because it was mutably borrowed
19     *p = 3;
20 }
21
22 fn field_copy_after_var_borrow() {
23     let mut x = A { a: 1, b: 2 };
24     let p = &mut x;
25     drop(x.a); //~ ERROR cannot use `x.a` because it was mutably borrowed
26     p.a = 3;
27 }
28
29 fn field_copy_after_field_borrow() {
30     let mut x = A { a: 1, b: 2 };
31     let p = &mut x.a;
32     drop(x.a); //~ ERROR cannot use `x.a` because it was mutably borrowed
33     *p = 3;
34 }
35
36 fn fu_field_copy_after_var_borrow() {
37     let mut x = A { a: 1, b: 2 };
38     let p = &mut x;
39     let y = A { b: 3, .. x }; //~ ERROR cannot use `x.a` because it was mutably borrowed
40     drop(y);
41     p.a = 4;
42 }
43
44 fn fu_field_copy_after_field_borrow() {
45     let mut x = A { a: 1, b: 2 };
46     let p = &mut x.a;
47     let y = A { b: 3, .. x }; //~ ERROR cannot use `x.a` because it was mutably borrowed
48     drop(y);
49     *p = 4;
50 }
51
52 fn var_deref_after_var_borrow() {
53     let mut x: Box<isize> = Box::new(1);
54     let p = &mut x;
55     drop(*x); //~ ERROR cannot use `*x` because it was mutably borrowed
56     **p = 2;
57 }
58
59 fn field_deref_after_var_borrow() {
60     let mut x = B { a: 1, b: Box::new(2) };
61     let p = &mut x;
62     drop(*x.b); //~ ERROR cannot use `*x.b` because it was mutably borrowed
63     p.a = 3;
64 }
65
66 fn field_deref_after_field_borrow() {
67     let mut x = B { a: 1, b: Box::new(2) };
68     let p = &mut x.b;
69     drop(*x.b); //~ ERROR cannot use `*x.b` because it was mutably borrowed
70     **p = 3;
71 }
72
73 fn main() {
74     var_copy_after_var_borrow();
75     var_copy_after_field_borrow();
76
77     field_copy_after_var_borrow();
78     field_copy_after_field_borrow();
79
80     fu_field_copy_after_var_borrow();
81     fu_field_copy_after_field_borrow();
82
83     var_deref_after_var_borrow();
84     field_deref_after_var_borrow();
85     field_deref_after_field_borrow();
86 }