Skip to content

Commit a1b8a93

Browse files
committed
Expand long-live-borrows-in-boxes test to include simplier illustrative cases.
After talking about the PR with eddyb, I decided it was best to try to have some test cases that simplify the problem down to its core, so that people trying to understand what the issue is here will see those core examples first.
1 parent 469d6a8 commit a1b8a93

File tree

1 file changed

+35
-5
lines changed

1 file changed

+35
-5
lines changed

src/test/ui/issue-45696-long-live-borrows-in-boxes.rs

+35-5
Original file line numberDiff line numberDiff line change
@@ -22,24 +22,54 @@
2222

2323
// run-pass
2424

25-
type Boxed<'a, 'b> = Box<(&'a mut u32, &'b mut u32)>;
25+
// This function shows quite directly what is going on: We have a
26+
// reborrow of contents within the box.
27+
fn return_borrow_from_dropped_box_1(x: Box<&mut u32>) -> &mut u32 { &mut **x }
2628

27-
fn return_borrow_from_dropped_box<'a>(x: Boxed<'a, '_>) -> &'a mut u32 {
29+
// This function is the way you'll probably see this in practice (the
30+
// reborrow is now implicit).
31+
fn return_borrow_from_dropped_box_2(x: Box<&mut u32>) -> &mut u32 { *x }
32+
33+
// For the remaining tests we just add some fields or other
34+
// indirection to ensure that the compiler isn't just special-casing
35+
// the above `Box<&mut T>` as the only type that would work.
36+
37+
// Here we add a tuple of indirection between the box and the
38+
// reference.
39+
type BoxedTup<'a, 'b> = Box<(&'a mut u32, &'b mut u32)>;
40+
41+
fn return_borrow_of_field_from_dropped_box_1<'a>(x: BoxedTup<'a, '_>) -> &'a mut u32 {
2842
&mut *x.0
2943
}
3044

31-
fn return_borrow_from_dropped_tupled_box<'a>(x: (Boxed<'a, '_>, &mut u32)) -> &'a mut u32 {
45+
fn return_borrow_of_field_from_dropped_box_2<'a>(x: BoxedTup<'a, '_>) -> &'a mut u32 {
46+
x.0
47+
}
48+
49+
fn return_borrow_from_dropped_tupled_box_1<'a>(x: (BoxedTup<'a, '_>, &mut u32)) -> &'a mut u32 {
3250
&mut *(x.0).0
3351
}
3452

53+
fn return_borrow_from_dropped_tupled_box_2<'a>(x: (BoxedTup<'a, '_>, &mut u32)) -> &'a mut u32 {
54+
(x.0).0
55+
}
56+
3557
fn basic_tests() {
3658
let mut x = 2;
3759
let mut y = 3;
3860
let mut z = 4;
39-
*return_borrow_from_dropped_box(Box::new((&mut x, &mut y))) += 10;
61+
*return_borrow_from_dropped_box_1(Box::new(&mut x)) += 10;
4062
assert_eq!((x, y, z), (12, 3, 4));
41-
*return_borrow_from_dropped_tupled_box((Box::new((&mut x, &mut y)), &mut z)) += 10;
63+
*return_borrow_from_dropped_box_2(Box::new(&mut x)) += 10;
4264
assert_eq!((x, y, z), (22, 3, 4));
65+
*return_borrow_of_field_from_dropped_box_1(Box::new((&mut x, &mut y))) += 10;
66+
assert_eq!((x, y, z), (32, 3, 4));
67+
*return_borrow_of_field_from_dropped_box_2(Box::new((&mut x, &mut y))) += 10;
68+
assert_eq!((x, y, z), (42, 3, 4));
69+
*return_borrow_from_dropped_tupled_box_1((Box::new((&mut x, &mut y)), &mut z)) += 10;
70+
assert_eq!((x, y, z), (52, 3, 4));
71+
*return_borrow_from_dropped_tupled_box_2((Box::new((&mut x, &mut y)), &mut z)) += 10;
72+
assert_eq!((x, y, z), (62, 3, 4));
4373
}
4474

4575
// These scribbling tests have been transcribed from

0 commit comments

Comments
 (0)