- 
                Notifications
    You must be signed in to change notification settings 
- Fork 13.9k
Closed
Labels
A-MIRArea: Mid-level IR (MIR) - https://blog.rust-lang.org/2016/04/19/MIR.htmlArea: Mid-level IR (MIR) - https://blog.rust-lang.org/2016/04/19/MIR.html
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.
Metadata
Metadata
Assignees
Labels
A-MIRArea: Mid-level IR (MIR) - https://blog.rust-lang.org/2016/04/19/MIR.htmlArea: Mid-level IR (MIR) - https://blog.rust-lang.org/2016/04/19/MIR.html