Skip to content

MIR: broken MIR generated for Box #31463

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
arielb1 opened this issue Feb 7, 2016 · 3 comments
Closed

MIR: broken MIR generated for Box #31463

arielb1 opened this issue Feb 7, 2016 · 3 comments
Labels
A-MIR Area: Mid-level IR (MIR) - https://blog.rust-lang.org/2016/04/19/MIR.html

Comments

@arielb1
Copy link
Contributor

arielb1 commented Feb 7, 2016

#![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.

@arielb1
Copy link
Contributor Author

arielb1 commented Feb 7, 2016

cc @nagisa @nikomatsakis

@nagisa
Copy link
Member

nagisa commented Feb 7, 2016

Freeing boxes should've been fixed in #31307.

EDIT: I wasn’t looking closely enough, it is indeed broken.

@arielb1
Copy link
Contributor Author

arielb1 commented Feb 7, 2016

This is a problem on latest master (f50fb15)

nagisa added a commit to nagisa/rust that referenced this issue Feb 7, 2016
@nagisa nagisa added the A-MIR Area: Mid-level IR (MIR) - https://blog.rust-lang.org/2016/04/19/MIR.html label Feb 7, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-MIR Area: Mid-level IR (MIR) - https://blog.rust-lang.org/2016/04/19/MIR.html
Projects
None yet
Development

No branches or pull requests

2 participants