1 // Test that `Box<T>` is treated specially by borrow checking. This is the case
2 // because NLL reverted the deicision in rust-lang/rfcs#130.
3
4 // run-pass
5
6 struct A {
7 x: Box<isize>,
8 y: isize,
9 }
10
11 struct B {
12 x: Box<isize>,
13 y: Box<isize>,
14 }
15
16 struct C {
17 x: Box<A>,
18 y: isize,
19 }
20
21 struct D {
22 x: Box<A>,
23 y: Box<isize>,
24 }
25
copy_after_move()26 fn copy_after_move() {
27 let a: Box<_> = Box::new(A { x: Box::new(0), y: 1 });
28 let _x = a.x;
29 let _y = a.y;
30 }
31
move_after_move()32 fn move_after_move() {
33 let a: Box<_> = Box::new(B { x: Box::new(0), y: Box::new(1) });
34 let _x = a.x;
35 let _y = a.y;
36 }
37
borrow_after_move()38 fn borrow_after_move() {
39 let a: Box<_> = Box::new(A { x: Box::new(0), y: 1 });
40 let _x = a.x;
41 let _y = &a.y;
42 }
43
move_after_borrow()44 fn move_after_borrow() {
45 let a: Box<_> = Box::new(B { x: Box::new(0), y: Box::new(1) });
46 let _x = &a.x;
47 let _y = a.y;
48 use_imm(_x);
49 }
copy_after_mut_borrow()50 fn copy_after_mut_borrow() {
51 let mut a: Box<_> = Box::new(A { x: Box::new(0), y: 1 });
52 let _x = &mut a.x;
53 let _y = a.y;
54 use_mut(_x);
55 }
move_after_mut_borrow()56 fn move_after_mut_borrow() {
57 let mut a: Box<_> = Box::new(B { x: Box::new(0), y: Box::new(1) });
58 let _x = &mut a.x;
59 let _y = a.y;
60 use_mut(_x);
61 }
borrow_after_mut_borrow()62 fn borrow_after_mut_borrow() {
63 let mut a: Box<_> = Box::new(A { x: Box::new(0), y: 1 });
64 let _x = &mut a.x;
65 let _y = &a.y;
66 use_mut(_x);
67 }
mut_borrow_after_borrow()68 fn mut_borrow_after_borrow() {
69 let mut a: Box<_> = Box::new(A { x: Box::new(0), y: 1 });
70 let _x = &a.x;
71 let _y = &mut a.y;
72 use_imm(_x);
73 }
copy_after_move_nested()74 fn copy_after_move_nested() {
75 let a: Box<_> = Box::new(C { x: Box::new(A { x: Box::new(0), y: 1 }), y: 2 });
76 let _x = a.x.x;
77 let _y = a.y;
78 }
79
move_after_move_nested()80 fn move_after_move_nested() {
81 let a: Box<_> = Box::new(D { x: Box::new(A { x: Box::new(0), y: 1 }), y: Box::new(2) });
82 let _x = a.x.x;
83 let _y = a.y;
84 }
85
borrow_after_move_nested()86 fn borrow_after_move_nested() {
87 let a: Box<_> = Box::new(C { x: Box::new(A { x: Box::new(0), y: 1 }), y: 2 });
88 let _x = a.x.x;
89 let _y = &a.y;
90 }
91
move_after_borrow_nested()92 fn move_after_borrow_nested() {
93 let a: Box<_> = Box::new(D { x: Box::new(A { x: Box::new(0), y: 1 }), y: Box::new(2) });
94 let _x = &a.x.x;
95 let _y = a.y;
96 use_imm(_x);
97 }
copy_after_mut_borrow_nested()98 fn copy_after_mut_borrow_nested() {
99 let mut a: Box<_> = Box::new(C { x: Box::new(A { x: Box::new(0), y: 1 }), y: 2 });
100 let _x = &mut a.x.x;
101 let _y = a.y;
102 use_mut(_x);
103 }
move_after_mut_borrow_nested()104 fn move_after_mut_borrow_nested() {
105 let mut a: Box<_> = Box::new(D { x: Box::new(A { x: Box::new(0), y: 1 }), y: Box::new(2) });
106 let _x = &mut a.x.x;
107 let _y = a.y;
108 use_mut(_x);
109 }
borrow_after_mut_borrow_nested()110 fn borrow_after_mut_borrow_nested() {
111 let mut a: Box<_> = Box::new(C { x: Box::new(A { x: Box::new(0), y: 1 }), y: 2 });
112 let _x = &mut a.x.x;
113 let _y = &a.y;
114 use_mut(_x);
115 }
mut_borrow_after_borrow_nested()116 fn mut_borrow_after_borrow_nested() {
117 let mut a: Box<_> = Box::new(C { x: Box::new(A { x: Box::new(0), y: 1 }), y: 2 });
118 let _x = &a.x.x;
119 let _y = &mut a.y;
120 use_imm(_x);
121 }
122
main()123 fn main() {
124 copy_after_move();
125 move_after_move();
126 borrow_after_move();
127
128 move_after_borrow();
129
130 copy_after_mut_borrow();
131 move_after_mut_borrow();
132 borrow_after_mut_borrow();
133 mut_borrow_after_borrow();
134
135 copy_after_move_nested();
136 move_after_move_nested();
137 borrow_after_move_nested();
138
139 move_after_borrow_nested();
140
141 copy_after_mut_borrow_nested();
142 move_after_mut_borrow_nested();
143 borrow_after_mut_borrow_nested();
144 mut_borrow_after_borrow_nested();
145 }
146
use_mut<T>(_: &mut T)147 fn use_mut<T>(_: &mut T) { }
use_imm<T>(_: &T)148 fn use_imm<T>(_: &T) { }
149