diff options
| author | Graydon Hoare <[email protected]> | 2010-12-13 17:48:33 -0800 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2010-12-13 17:48:42 -0800 |
| commit | 525966a543a6d03d10393b55a5207678aab8c147 (patch) | |
| tree | 5fa857473bb94f7e90afe16e4943f7ff32344ae8 /src | |
| parent | rustc: Typecheck pattern bindings (diff) | |
| download | rust-525966a543a6d03d10393b55a5207678aab8c147.tar.xz rust-525966a543a6d03d10393b55a5207678aab8c147.zip | |
Fix a couple bugs in iter_sequence, un-XFAIL vec-drop.rs.
Diffstat (limited to 'src')
| -rw-r--r-- | src/Makefile | 1 | ||||
| -rw-r--r-- | src/comp/middle/trans.rs | 20 |
2 files changed, 18 insertions, 3 deletions
diff --git a/src/Makefile b/src/Makefile index 2c421534..c77b8994 100644 --- a/src/Makefile +++ b/src/Makefile @@ -559,6 +559,7 @@ TEST_XFAILS_SELF := $(filter-out \ uint.rs \ unit.rs \ vec.rs \ + vec-drop.rs \ vec-in-tup.rs \ vec-late-init.rs \ while-and-do-while.rs \ diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index cbf01735..82a5d3fb 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -854,9 +854,14 @@ fn iter_sequence(@block_ctxt cx, C_int(abi.vec_elt_data))); auto lenptr = cx.build.GEP(v, vec(C_int(0), C_int(abi.vec_elt_fill))); + + auto llunit_ty = type_of(cx.fcx.ccx, elt_ty); + auto unit_sz = llvm.LLVMConstIntCast(llvm.LLVMSizeOf(llunit_ty), + T_int(), False); + auto len = cx.build.Load(lenptr); if (trailing_null) { - len = cx.build.Sub(len, C_int(1)); + len = cx.build.Sub(len, unit_sz); } auto r = res(cx, C_nil()); @@ -868,7 +873,11 @@ fn iter_sequence(@block_ctxt cx, cx.build.Br(cond_cx.llbb); auto ix = cond_cx.build.Phi(T_int(), vec(C_int(0)), vec(cx.llbb)); - auto end_test = cond_cx.build.ICmp(lib.llvm.LLVMIntEQ, ix, len); + auto scaled_ix = cond_cx.build.Phi(T_int(), + vec(C_int(0)), vec(cx.llbb)); + + auto end_test = cond_cx.build.ICmp(lib.llvm.LLVMIntNE, + scaled_ix, len); cond_cx.build.CondBr(end_test, body_cx.llbb, next_cx.llbb); auto elt = body_cx.build.GEP(p0, vec(C_int(0), ix)); @@ -876,9 +885,14 @@ fn iter_sequence(@block_ctxt cx, load_non_structural(body_cx, elt, elt_ty), elt_ty); auto next_ix = body_res.bcx.build.Add(ix, C_int(1)); + auto next_scaled_ix = body_res.bcx.build.Add(scaled_ix, unit_sz); + cond_cx.build.AddIncomingToPhi(ix, vec(next_ix), vec(body_res.bcx.llbb)); + cond_cx.build.AddIncomingToPhi(scaled_ix, vec(next_scaled_ix), + vec(body_res.bcx.llbb)); + body_res.bcx.build.Br(cond_cx.llbb); ret res(next_cx, C_nil()); } @@ -889,7 +903,7 @@ fn iter_sequence(@block_ctxt cx, } case (typeck.ty_str) { auto et = typeck.plain_ty(typeck.ty_machine(common.ty_u8)); - ret iter_sequence_body(cx, v, et, f, false); + ret iter_sequence_body(cx, v, et, f, true); } case (_) { fail; } } |