@@ -437,20 +437,31 @@ fn trans_alt(cx: &@block_ctxt, expr: &@ast::expr, arms: &ast::arm[],
437
437
438
438
// Not alt-related, but similar to the pattern-munging code above
439
439
fn bind_irrefutable_pat ( bcx : @block_ctxt , pat : & @ast:: pat , val : ValueRef ,
440
- table : hashmap[ ast:: node_id , ValueRef ] )
440
+ table : hashmap[ ast:: node_id , ValueRef ] , copy : bool )
441
441
-> @block_ctxt {
442
442
let ccx = bcx. fcx . lcx . ccx ;
443
443
alt pat. node {
444
444
ast:: pat_bind ( _) {
445
- table. insert ( pat. id , val) ;
445
+ if copy {
446
+ let ty = ty:: node_id_to_monotype ( ccx. tcx , pat. id ) ;
447
+ let llty = trans:: type_of ( ccx, pat. span , ty) ;
448
+ let alloc = trans:: alloca ( bcx, llty) ;
449
+ bcx = trans:: memmove_ty ( bcx, alloc, val, ty) . bcx ;
450
+ let loaded = trans:: load_if_immediate ( bcx, alloc, ty) ;
451
+ bcx = trans:: copy_ty ( bcx, loaded, ty) . bcx ;
452
+ table. insert ( pat. id , alloc) ;
453
+ trans_common:: add_clean ( bcx, alloc, ty) ;
454
+ } else {
455
+ table. insert ( pat. id , val) ;
456
+ }
446
457
}
447
458
ast:: pat_tag ( _, sub) {
448
459
if ivec:: len ( sub) == 0 u { ret bcx; }
449
460
let vdefs = ast:: variant_def_ids ( ccx. tcx . def_map . get ( pat. id ) ) ;
450
461
let args = extract_variant_args ( bcx, pat. id , vdefs, val) ;
451
462
let i = 0 ;
452
463
for argval: ValueRef in args. vals {
453
- bcx = bind_irrefutable_pat ( bcx, sub. ( i) , argval, table) ;
464
+ bcx = bind_irrefutable_pat ( bcx, sub. ( i) , argval, table, copy ) ;
454
465
i += 1 ;
455
466
}
456
467
}
@@ -462,14 +473,14 @@ fn bind_irrefutable_pat(bcx: @block_ctxt, pat: &@ast::pat, val: ValueRef,
462
473
let ix: uint =
463
474
ty:: field_idx ( ccx. sess , pat. span , f. ident , rec_fields) ;
464
475
let r = trans:: GEP_tup_like ( bcx, rec_ty, val, ~[ 0 , ix as int ] ) ;
465
- bcx = bind_irrefutable_pat ( r. bcx , f. pat , r. val , table) ;
476
+ bcx = bind_irrefutable_pat ( r. bcx , f. pat , r. val , table, copy ) ;
466
477
}
467
478
}
468
479
ast:: pat_box ( inner) {
469
480
let box = bcx. build . Load ( val) ;
470
481
let unboxed = bcx. build . InBoundsGEP
471
482
( box, ~[ C_int ( 0 ) , C_int ( back:: abi:: box_rc_field_body) ] ) ;
472
- bcx = bind_irrefutable_pat ( bcx, inner, unboxed, table) ;
483
+ bcx = bind_irrefutable_pat ( bcx, inner, unboxed, table, true ) ;
473
484
}
474
485
ast:: pat_wild. | ast:: pat_lit ( _) { }
475
486
}
0 commit comments