]> git.lizzy.rs Git - rust.git/blob - tests/ui/borrowck/borrowck-reborrow-from-mut.rs
Auto merge of #107663 - matthiaskrgr:107423-point-at-EOF-code, r=compiler-errors
[rust.git] / tests / ui / borrowck / borrowck-reborrow-from-mut.rs
1 struct Foo {
2   bar1: Bar,
3   bar2: Bar
4 }
5
6 struct Bar {
7   int1: isize,
8   int2: isize,
9 }
10
11 fn borrow_same_field_twice_mut_mut(foo: &mut Foo) {
12     let _bar1 = &mut foo.bar1;
13     let _bar2 = &mut foo.bar1;  //~ ERROR cannot borrow
14     use_mut(_bar1);
15 }
16 fn borrow_same_field_twice_mut_imm(foo: &mut Foo) {
17     let _bar1 = &mut foo.bar1;
18     let _bar2 = &foo.bar1;  //~ ERROR cannot borrow
19     use_mut(_bar1);
20 }
21 fn borrow_same_field_twice_imm_mut(foo: &mut Foo) {
22     let _bar1 = &foo.bar1;
23     let _bar2 = &mut foo.bar1;  //~ ERROR cannot borrow
24     use_imm(_bar1);
25 }
26 fn borrow_same_field_twice_imm_imm(foo: &mut Foo) {
27     let _bar1 = &foo.bar1;
28     let _bar2 = &foo.bar1;
29     use_imm(_bar1);
30 }
31 fn borrow_both_mut(foo: &mut Foo) {
32     let _bar1 = &mut foo.bar1;
33     let _bar2 = &mut foo.bar2;
34     use_mut(_bar1);
35 }
36 fn borrow_both_mut_pattern(foo: &mut Foo) {
37     match *foo {
38         Foo { bar1: ref mut _bar1, bar2: ref mut _bar2 } =>
39         { use_mut(_bar1); use_mut(_bar2); }
40     }
41 }
42 fn borrow_var_and_pattern(foo: &mut Foo) {
43     let _bar1 = &mut foo.bar1;
44     match *foo {
45         Foo { bar1: ref mut _bar1, bar2: _ } => {}
46         //~^ ERROR cannot borrow
47     }
48     use_mut(_bar1);
49 }
50 fn borrow_mut_and_base_imm(foo: &mut Foo) {
51     let _bar1 = &mut foo.bar1.int1;
52     let _foo1 = &foo.bar1; //~ ERROR cannot borrow
53     let _foo2 = &*foo; //~ ERROR cannot borrow
54     use_mut(_bar1);
55 }
56 fn borrow_mut_and_base_mut(foo: &mut Foo) {
57     let _bar1 = &mut foo.bar1.int1;
58     let _foo1 = &mut foo.bar1; //~ ERROR cannot borrow
59     use_mut(_bar1);
60 }
61 fn borrow_mut_and_base_mut2(foo: &mut Foo) {
62     let _bar1 = &mut foo.bar1.int1;
63     let _foo2 = &mut *foo; //~ ERROR cannot borrow
64     use_mut(_bar1);
65 }
66 fn borrow_imm_and_base_mut(foo: &mut Foo) {
67     let _bar1 = &foo.bar1.int1;
68     let _foo1 = &mut foo.bar1; //~ ERROR cannot borrow
69     use_imm(_bar1);
70 }
71 fn borrow_imm_and_base_mut2(foo: &mut Foo) {
72     let _bar1 = &foo.bar1.int1;
73     let _foo2 = &mut *foo; //~ ERROR cannot borrow
74     use_imm(_bar1);
75 }
76 fn borrow_imm_and_base_imm(foo: &mut Foo) {
77     let _bar1 = &foo.bar1.int1;
78     let _foo1 = &foo.bar1;
79     let _foo2 = &*foo;
80     use_imm(_bar1);
81 }
82 fn borrow_mut_and_imm(foo: &mut Foo) {
83     let _bar1 = &mut foo.bar1;
84     let _foo1 = &foo.bar2;
85     use_mut(_bar1);
86 }
87 fn borrow_mut_from_imm(foo: &Foo) {
88     let _bar1 = &mut foo.bar1; //~ ERROR cannot borrow
89 }
90
91 fn borrow_long_path_both_mut(foo: &mut Foo) {
92     let _bar1 = &mut foo.bar1.int1;
93     let _foo1 = &mut foo.bar2.int2;
94     use_mut(_bar1);
95 }
96 fn main() {}
97
98 fn use_mut<T>(_: &mut T) { }
99 fn use_imm<T>(_: &T) { }