diff options
| author | Brian Anderson <banderson@mozilla.com> | 2012-03-13 17:24:39 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2012-03-13 17:27:17 -0700 |
| commit | aeb445b2ea25f9629df1d5d8fbd2906a92c8e719 (patch) | |
| tree | 4b4a3d85d98c6b394ee95e0dbcbe0158cefc9f31 /src | |
| parent | b87cdd857228e576d0fcccba0d92b0b231375923 (diff) | |
| download | rust-aeb445b2ea25f9629df1d5d8fbd2906a92c8e719.tar.gz rust-aeb445b2ea25f9629df1d5d8fbd2906a92c8e719.zip | |
rustc: Don't make the while loop body's basic block a child of the condition
As a child of the condition, when the body encounters a ret or break it incorrectly re-runs the cleanups of the condition.
Diffstat (limited to 'src')
| -rw-r--r-- | src/rustc/middle/trans/base.rs | 10 | ||||
| -rw-r--r-- | src/test/run-pass/issue-1974.rs | 8 |
2 files changed, 14 insertions, 4 deletions
diff --git a/src/rustc/middle/trans/base.rs b/src/rustc/middle/trans/base.rs index e7ab3c39899..67723337cfb 100644 --- a/src/rustc/middle/trans/base.rs +++ b/src/rustc/middle/trans/base.rs @@ -2001,10 +2001,12 @@ fn trans_for(cx: block, local: @ast::local, seq: @ast::expr, fn trans_while(cx: block, cond: @ast::expr, body: ast::blk) -> block { let next_cx = sub_block(cx, "while next"); - let cond_cx = loop_scope_block(cx, cont_self, next_cx, - "while cond", body.span); - let body_cx = scope_block(cond_cx, "while loop body"); - Br(cx, cond_cx.llbb); + let loop_cx = loop_scope_block(cx, cont_self, next_cx, + "while loop", body.span); + let cond_cx = scope_block(loop_cx, "while loop cond"); + let body_cx = scope_block(loop_cx, "while loop body"); + Br(cx, loop_cx.llbb); + Br(loop_cx, cond_cx.llbb); let cond_res = trans_temp_expr(cond_cx, cond); let cond_bcx = trans_block_cleanups(cond_res.bcx, cond_cx); CondBr(cond_bcx, cond_res.val, body_cx.llbb, next_cx.llbb); diff --git a/src/test/run-pass/issue-1974.rs b/src/test/run-pass/issue-1974.rs new file mode 100644 index 00000000000..ba84ad967c5 --- /dev/null +++ b/src/test/run-pass/issue-1974.rs @@ -0,0 +1,8 @@ +// Issue 1974 +// Don't double free the condition allocation +fn main() { + let s = "hej"; + while s != "" { + ret; + } +} \ No newline at end of file |
