@@ -3752,24 +3752,27 @@ fn trans_pat_match(@block_ctxt cx, @ast.pat pat, ValueRef llval,
3752
3752
fail;
3753
3753
}
3754
3754
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)
3756
3757
-> result {
3757
3758
alt ( pat. node) {
3758
3759
case ( ast. pat_wild( _) ) { ret res( cx, llval) ; }
3759
3760
case ( ast. pat_lit( _, _) ) { ret res( cx, llval) ; }
3760
3761
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
+ }
3773
3776
}
3774
3777
case ( ast. pat_tag( _, ?subpats, ?vdef_opt, ?ann) ) {
3775
3778
if ( _vec. len[ @ast. pat] ( subpats) == 0 u) { ret res( cx, llval) ; }
@@ -3789,12 +3792,8 @@ fn trans_pat_binding(@block_ctxt cx, @ast.pat pat, ValueRef llval)
3789
3792
auto rslt = GEP_tag ( this_cx, llblobptr, vdef. _0, vdef. _1,
3790
3793
ty_param_substs, i) ;
3791
3794
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) ) ;
3796
3795
auto subpat_res = trans_pat_binding( this_cx, subpat,
3797
- llsubval ) ;
3796
+ rslt . val , true ) ;
3798
3797
this_cx = subpat_res. bcx;
3799
3798
i += 1 ;
3800
3799
}
@@ -3819,7 +3818,7 @@ fn trans_alt(@block_ctxt cx, @ast.expr expr,
3819
3818
match_res. bcx. build. Br ( binding_cx. llbb) ;
3820
3819
3821
3820
auto binding_res = trans_pat_binding( binding_cx, arm. pat,
3822
- expr_res. val) ;
3821
+ expr_res. val, false ) ;
3823
3822
3824
3823
auto block_res = trans_block( binding_res. bcx, arm. block) ;
3825
3824
arm_results += vec( block_res) ;
0 commit comments