Skip to content

Commit 03a68d6

Browse files
committed
Auto merge of #62331 - wesleywiser:fix_early_return_leak, r=matthewjasper
Fix leak when early returning out of `box` syntax Fixes #62289 r? @matthewjasper
2 parents fa6b706 + aabaf12 commit 03a68d6

File tree

2 files changed

+92
-1
lines changed

2 files changed

+92
-1
lines changed

src/librustc_mir/build/expr/as_rvalue.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
128128
expr_span,
129129
scope,
130130
result,
131-
value.ty,
131+
expr.ty,
132132
);
133133
}
134134

src/test/mir-opt/issue-62289.rs

+91
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
// check that we don't forget to drop the Box if we early return before
2+
// initializing it
3+
// ignore-tidy-linelength
4+
// ignore-wasm32-bare compiled with panic=abort by default
5+
6+
#![feature(box_syntax)]
7+
8+
fn test() -> Option<Box<u32>> {
9+
Some(box (None?))
10+
}
11+
12+
fn main() {
13+
test();
14+
}
15+
16+
// END RUST SOURCE
17+
// START rustc.test.ElaborateDrops.before.mir
18+
// fn test() -> std::option::Option<std::boxed::Box<u32>> {
19+
// ...
20+
// bb0: {
21+
// StorageLive(_1);
22+
// StorageLive(_2);
23+
// _2 = Box(u32);
24+
// StorageLive(_3);
25+
// StorageLive(_4);
26+
// _4 = std::option::Option::<u32>::None;
27+
// _3 = const <std::option::Option<u32> as std::ops::Try>::into_result(move _4) -> [return: bb2, unwind: bb3];
28+
// }
29+
// bb1 (cleanup): {
30+
// resume;
31+
// }
32+
// bb2: {
33+
// StorageDead(_4);
34+
// _5 = discriminant(_3);
35+
// switchInt(move _5) -> [0isize: bb10, 1isize: bb5, otherwise: bb4];
36+
// }
37+
// bb3 (cleanup): {
38+
// drop(_2) -> bb1;
39+
// }
40+
// bb4: {
41+
// unreachable;
42+
// }
43+
// bb5: {
44+
// StorageLive(_6);
45+
// _6 = ((_3 as Err).0: std::option::NoneError);
46+
// StorageLive(_8);
47+
// StorageLive(_9);
48+
// _9 = _6;
49+
// _8 = const <std::option::NoneError as std::convert::From<std::option::NoneError>>::from(move _9) -> [return: bb7, unwind: bb3];
50+
// }
51+
// bb6: {
52+
// return;
53+
// }
54+
// bb7: {
55+
// StorageDead(_9);
56+
// _0 = const <std::option::Option<std::boxed::Box<u32>> as std::ops::Try>::from_error(move _8) -> [return: bb8, unwind: bb3];
57+
// }
58+
// bb8: {
59+
// StorageDead(_8);
60+
// StorageDead(_6);
61+
// drop(_2) -> bb9;
62+
// }
63+
// bb9: {
64+
// StorageDead(_2);
65+
// StorageDead(_1);
66+
// StorageDead(_3);
67+
// goto -> bb6;
68+
// }
69+
// bb10: {
70+
// StorageLive(_10);
71+
// _10 = ((_3 as Ok).0: u32);
72+
// (*_2) = _10;
73+
// StorageDead(_10);
74+
// _1 = move _2;
75+
// drop(_2) -> [return: bb12, unwind: bb11];
76+
// }
77+
// bb11 (cleanup): {
78+
// drop(_1) -> bb1;
79+
// }
80+
// bb12: {
81+
// StorageDead(_2);
82+
// _0 = std::option::Option::<std::boxed::Box<u32>>::Some(move _1,);
83+
// drop(_1) -> bb13;
84+
// }
85+
// bb13: {
86+
// StorageDead(_1);
87+
// StorageDead(_3);
88+
// goto -> bb6;
89+
// }
90+
// }
91+
// END rustc.test.ElaborateDrops.before.mir

0 commit comments

Comments
 (0)