@@ -624,7 +624,10 @@ fn trans_alt(cx: @block_ctxt, expr: @ast::expr, arms: [ast::arm],
624
624
dest : trans:: dest ) -> @block_ctxt {
625
625
let bodies = [ ] ;
626
626
let match: match = [ ] ;
627
- let er = trans:: trans_temp_expr ( cx, expr) ;
627
+ let alt_cx = new_scope_block_ctxt ( cx, "alt" ) ;
628
+ Br ( cx, alt_cx. llbb ) ;
629
+
630
+ let er = trans:: trans_temp_expr ( alt_cx, expr) ;
628
631
if er. bcx . unreachable { ret er. bcx ; }
629
632
630
633
for a: ast:: arm in arms {
@@ -654,7 +657,7 @@ fn trans_alt(cx: @block_ctxt, expr: @ast::expr, arms: [ast::arm],
654
657
let t = trans:: node_id_type ( cx. fcx . lcx . ccx , expr. id ) ;
655
658
let vr = trans:: spill_if_immediate ( er. bcx , er. val , t) ;
656
659
compile_submatch ( vr. bcx , match , [ vr. val ] ,
657
- bind mk_fail ( cx , expr. span , fail_cx) , exit_map) ;
660
+ bind mk_fail ( alt_cx , expr. span , fail_cx) , exit_map) ;
658
661
659
662
let arm_cxs = [ ] , arm_dests = [ ] , i = 0 u;
660
663
for a: ast:: arm in arms {
@@ -667,7 +670,11 @@ fn trans_alt(cx: @block_ctxt, expr: @ast::expr, arms: [ast::arm],
667
670
}
668
671
i += 1 u;
669
672
}
670
- ret trans:: join_returns ( cx, arm_cxs, arm_dests, dest) ;
673
+ let after_cx = trans:: join_returns ( cx, arm_cxs, arm_dests, dest) ;
674
+ after_cx = trans:: trans_block_cleanups ( after_cx, alt_cx) ;
675
+ let next_cx = new_sub_block_ctxt ( after_cx, "next" ) ;
676
+ Br ( after_cx, next_cx. llbb ) ;
677
+ ret next_cx;
671
678
}
672
679
673
680
// Not alt-related, but similar to the pattern-munging code above
0 commit comments