Skip to content

MIR: broken MIR generated for Box #31463

Closed
@arielb1

Description

@arielb1
#![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

No one assigned

    Labels

    A-MIRArea: Mid-level IR (MIR) - https://blog.rust-lang.org/2016/04/19/MIR.html

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions