Skip to content

Commit 1b9e6b3

Browse files
committed
Bind tag members as aliases rather than new locals.
1 parent 5fe21b5 commit 1b9e6b3

File tree

1 file changed

+18
-19
lines changed

1 file changed

+18
-19
lines changed

src/comp/middle/trans.rs

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3752,24 +3752,27 @@ fn trans_pat_match(@block_ctxt cx, @ast.pat pat, ValueRef llval,
37523752
fail;
37533753
}
37543754

3755-
fn trans_pat_binding(@block_ctxt cx, @ast.pat pat, ValueRef llval)
3755+
fn trans_pat_binding(@block_ctxt cx, @ast.pat pat,
3756+
ValueRef llval, bool bind_alias)
37563757
-> result {
37573758
alt (pat.node) {
37583759
case (ast.pat_wild(_)) { ret res(cx, llval); }
37593760
case (ast.pat_lit(_, _)) { ret res(cx, llval); }
37603761
case (ast.pat_bind(?id, ?def_id, ?ann)) {
3761-
auto ty = node_ann_type(cx.fcx.lcx.ccx, ann);
3762-
3763-
auto rslt = alloc_ty(cx, ty);
3764-
auto dst = rslt.val;
3765-
auto bcx = rslt.bcx;
3766-
3767-
llvm.LLVMSetValueName(dst, _str.buf(id));
3768-
bcx.fcx.lllocals.insert(def_id, dst);
3769-
bcx.cleanups +=
3770-
vec(clean(bind drop_slot(_, dst, ty)));
3771-
3772-
ret copy_ty(bcx, INIT, dst, llval, ty);
3762+
if (bind_alias) {
3763+
cx.fcx.lllocals.insert(def_id, llval);
3764+
ret res(cx, llval);
3765+
} else {
3766+
auto t = node_ann_type(cx.fcx.lcx.ccx, ann);
3767+
auto rslt = alloc_ty(cx, t);
3768+
auto dst = rslt.val;
3769+
auto bcx = rslt.bcx;
3770+
llvm.LLVMSetValueName(dst, _str.buf(id));
3771+
bcx.fcx.lllocals.insert(def_id, dst);
3772+
bcx.cleanups +=
3773+
vec(clean(bind drop_slot(_, dst, t)));
3774+
ret copy_ty(bcx, INIT, dst, llval, t);
3775+
}
37733776
}
37743777
case (ast.pat_tag(_, ?subpats, ?vdef_opt, ?ann)) {
37753778
if (_vec.len[@ast.pat](subpats) == 0u) { ret res(cx, llval); }
@@ -3789,12 +3792,8 @@ fn trans_pat_binding(@block_ctxt cx, @ast.pat pat, ValueRef llval)
37893792
auto rslt = GEP_tag(this_cx, llblobptr, vdef._0, vdef._1,
37903793
ty_param_substs, i);
37913794
this_cx = rslt.bcx;
3792-
auto llsubvalptr = rslt.val;
3793-
3794-
auto llsubval = load_if_immediate(this_cx, llsubvalptr,
3795-
pat_ty(cx.fcx.lcx.ccx.tystore, subpat));
37963795
auto subpat_res = trans_pat_binding(this_cx, subpat,
3797-
llsubval);
3796+
rslt.val, true);
37983797
this_cx = subpat_res.bcx;
37993798
i += 1;
38003799
}
@@ -3819,7 +3818,7 @@ fn trans_alt(@block_ctxt cx, @ast.expr expr,
38193818
match_res.bcx.build.Br(binding_cx.llbb);
38203819

38213820
auto binding_res = trans_pat_binding(binding_cx, arm.pat,
3822-
expr_res.val);
3821+
expr_res.val, false);
38233822

38243823
auto block_res = trans_block(binding_res.bcx, arm.block);
38253824
arm_results += vec(block_res);

0 commit comments

Comments
 (0)