Skip to content

Commit b0c7439

Browse files
committed
Implement expr_put. Un-XFAIL foreach-simple.rs; iters w/o env access work.
1 parent 5508c28 commit b0c7439

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

src/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,7 @@ TEST_XFAILS_RUSTC := $(filter-out \
475475
else-if.rs \
476476
fact.rs \
477477
fn-lval.rs \
478+
foreach-simple.rs \
478479
fun-call-variants.rs \
479480
fun-indirect-call.rs \
480481
generic-derived-type.rs \

src/comp/middle/trans.rs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3454,8 +3454,35 @@ fn trans_fail(@block_ctxt cx, common.span sp, str fail_str) -> result {
34543454
}
34553455

34563456
fn trans_put(@block_ctxt cx, &option.t[@ast.expr] e) -> result {
3457-
cx.fcx.ccx.sess.unimpl("put expr");
3458-
fail;
3457+
auto llcallee = C_nil();
3458+
auto llenv = C_nil();
3459+
3460+
alt (cx.fcx.lliterbody) {
3461+
case (some[ValueRef](?lli)) {
3462+
auto slot = cx.build.Alloca(val_ty(lli));
3463+
cx.build.Store(lli, slot);
3464+
3465+
llcallee = cx.build.GEP(slot, vec(C_int(0),
3466+
C_int(abi.fn_field_code)));
3467+
llcallee = cx.build.Load(llcallee);
3468+
3469+
llenv = cx.build.GEP(slot, vec(C_int(0),
3470+
C_int(abi.fn_field_box)));
3471+
llenv = cx.build.Load(llenv);
3472+
}
3473+
}
3474+
auto bcx = cx;
3475+
auto dummy_retslot = bcx.build.Alloca(T_nil());
3476+
let vec[ValueRef] llargs = vec(dummy_retslot, cx.fcx.lltaskptr, llenv);
3477+
alt (e) {
3478+
case (none[@ast.expr]) { }
3479+
case (some[@ast.expr](?x)) {
3480+
auto r = trans_expr(bcx, x);
3481+
llargs += r.val;
3482+
bcx = r.bcx;
3483+
}
3484+
}
3485+
ret res(bcx, bcx.build.FastCall(llcallee, llargs));
34593486
}
34603487

34613488
fn trans_ret(@block_ctxt cx, &option.t[@ast.expr] e) -> result {

0 commit comments

Comments
 (0)