Closed
Description
#![feature(rustc_attrs, box_syntax)]
#[rustc_mir]
fn xyz(v: Result<[u32; 1024], ()>) -> Result<Box<Box<[u32; 1024]>>,()> {
Ok(box box match v {
Ok(x) => x,
Err(e) => return Err(e)
})
}
fn main() {
for i in 1..10000000 { xyz(Err(())); }
}
This generates the following (broken) MIR:
fn(arg0: core::result::Result<[u32; 1024], ()>) -> core::result::Result<Box<Box<
[u32; 1024]>>, ()> {
let var0: core::result::Result<[u32; 1024], ()>; // v
let var1: [u32; 1024]; // x
let var2: (); // e
let mut tmp0: Box<Box<[u32; 1024]>>;
let mut tmp1: Box<Box<[u32; 1024]>>;
let mut tmp2: Box<[u32; 1024]>;
let mut tmp3: ();
let mut tmp4: [u32; 1024];
let mut tmp5: ();
bb0: {
var0 = arg0;
tmp1 = Box(Box<[u32; 1024]>);
tmp2 = Box([u32; 1024]);
switch(var0) -> [Ok: bb4, Err: bb5];
}
bb1: {
return;
}
bb2: {
tmp4 = var1;
(*tmp2) = tmp4;
goto -> bb6;
}
bb3: {
tmp5 = var2;
return = core::result::Result::Err(tmp5);
drop(tmp0) -> bb1;
}
bb4: {
var1 = (var0 as Ok).0;
goto -> bb2;
}
bb5: {
var2 = (var0 as Err).0;
goto -> bb3;
}
bb6: {
(*tmp1) = tmp2;
tmp0 = tmp1;
return = core::result::Result::Ok(tmp0);
drop(tmp0) -> bb1;
}
}
As you can see, tmp0
is dropped but never written to (AFAIK this should be OK because of zeroing) but the boxes are never freed.