@@ -202,12 +202,12 @@ use middle::resolve::DefMap;
202202use middle:: trans:: adt;
203203use middle:: trans:: base:: * ;
204204use middle:: trans:: build:: * ;
205+ use middle:: trans:: build;
205206use middle:: trans:: callee;
206207use middle:: trans:: cleanup;
207208use middle:: trans:: cleanup:: CleanupMethods ;
208209use middle:: trans:: common:: * ;
209210use middle:: trans:: consts;
210- use middle:: trans:: controlflow;
211211use middle:: trans:: datum:: * ;
212212use middle:: trans:: expr:: Dest ;
213213use middle:: trans:: expr;
@@ -220,14 +220,12 @@ use util::ppaux::{Repr, vec_map_to_string};
220220
221221use std;
222222use std:: collections:: HashMap ;
223- use std:: cell:: Cell ;
224223use std:: rc:: Rc ;
225224use std:: gc:: { Gc } ;
226225use syntax:: ast;
227226use syntax:: ast:: Ident ;
228227use syntax:: codemap:: Span ;
229228use syntax:: fold:: Folder ;
230- use syntax:: parse:: token:: InternedString ;
231229
232230#[ deriving( PartialEq ) ]
233231pub enum VecLenOpt {
@@ -301,20 +299,6 @@ fn trans_opt<'a>(mut bcx: &'a Block<'a>, o: &Opt) -> opt_result<'a> {
301299 }
302300}
303301
304- fn variant_opt ( bcx : & Block , pat_id : ast:: NodeId ) -> Opt {
305- let ccx = bcx. ccx ( ) ;
306- let def = ccx. tcx . def_map . borrow ( ) . get_copy ( & pat_id) ;
307- match def {
308- def:: DefVariant ( enum_id, var_id, _) => {
309- let variant = ty:: enum_variant_with_id ( ccx. tcx ( ) , enum_id, var_id) ;
310- var ( variant. disr_val , adt:: represent_node ( bcx, pat_id) , var_id)
311- }
312- _ => {
313- ccx. sess ( ) . bug ( "non-variant or struct in variant_opt()" ) ;
314- }
315- }
316- }
317-
318302#[ deriving( Clone ) ]
319303pub enum TransBindingMode {
320304 TrByCopy ( /* llbinding */ ValueRef ) ,
@@ -630,26 +614,15 @@ fn get_options(bcx: &Block, m: &[Match], col: uint) -> Vec<Opt> {
630614 ast:: PatLit ( l) => {
631615 add_to_set ( ccx. tcx ( ) , & mut found, lit ( l) ) ;
632616 }
633- ast:: PatIdent ( ..) => {
617+ ast:: PatIdent ( ..) | ast :: PatEnum ( .. ) | ast :: PatStruct ( .. ) => {
634618 // This is either an enum variant or a variable binding.
635619 let opt_def = ccx. tcx . def_map . borrow ( ) . find_copy ( & cur. id ) ;
636620 match opt_def {
637- Some ( def:: DefVariant ( ..) ) => {
638- add_to_set ( ccx. tcx ( ) , & mut found,
639- variant_opt ( bcx, cur. id ) ) ;
640- }
641- _ => { }
642- }
643- }
644- ast:: PatEnum ( ..) | ast:: PatStruct ( ..) => {
645- // This could be one of: a tuple-like enum variant, a
646- // struct-like enum variant, or a struct.
647- let opt_def = ccx. tcx . def_map . borrow ( ) . find_copy ( & cur. id ) ;
648- match opt_def {
649- Some ( def:: DefFn ( ..) ) |
650- Some ( def:: DefVariant ( ..) ) => {
621+ Some ( def:: DefVariant ( enum_id, var_id, _) ) => {
622+ let variant = ty:: enum_variant_with_id ( ccx. tcx ( ) , enum_id, var_id) ;
651623 add_to_set ( ccx. tcx ( ) , & mut found,
652- variant_opt ( bcx, cur. id ) ) ;
624+ var ( variant. disr_val ,
625+ adt:: represent_node ( bcx, cur. id ) , var_id) ) ;
653626 }
654627 _ => { }
655628 }
@@ -795,56 +768,33 @@ fn any_irrefutable_adt_pat(bcx: &Block, m: &[Match], col: uint) -> bool {
795768 } )
796769}
797770
798- struct DynamicFailureHandler < ' a > {
799- bcx : & ' a Block < ' a > ,
800- sp : Span ,
801- msg : InternedString ,
802- finished : Cell < Option < BasicBlockRef > > ,
803- }
804-
805- impl < ' a > DynamicFailureHandler < ' a > {
806- fn handle_fail ( & self ) -> BasicBlockRef {
807- match self . finished . get ( ) {
808- Some ( bb) => return bb,
809- _ => ( ) ,
810- }
811-
812- let fcx = self . bcx . fcx ;
813- let fail_cx = fcx. new_block ( false , "case_fallthrough" , None ) ;
814- controlflow:: trans_fail ( fail_cx, self . sp , self . msg . clone ( ) ) ;
815- self . finished . set ( Some ( fail_cx. llbb ) ) ;
816- fail_cx. llbb
817- }
818- }
819-
820771/// What to do when the pattern match fails.
821772enum FailureHandler < ' a > {
822773 Infallible ,
823774 JumpToBasicBlock ( BasicBlockRef ) ,
824- DynamicFailureHandlerClass ( Box < DynamicFailureHandler < ' a > > ) ,
775+ Unreachable
825776}
826777
827778impl < ' a > FailureHandler < ' a > {
828779 fn is_infallible ( & self ) -> bool {
829780 match * self {
830781 Infallible => true ,
831- _ => false ,
782+ _ => false
832783 }
833784 }
834785
835786 fn is_fallible ( & self ) -> bool {
836787 !self . is_infallible ( )
837788 }
838789
839- fn handle_fail ( & self ) -> BasicBlockRef {
790+ fn handle_fail ( & self , bcx : & Block ) {
840791 match * self {
841- Infallible => {
842- fail ! ( "attempted to fail in infallible failure handler!" )
843- }
844- JumpToBasicBlock ( basic_block) => basic_block,
845- DynamicFailureHandlerClass ( ref dynamic_failure_handler) => {
846- dynamic_failure_handler. handle_fail ( )
847- }
792+ Infallible =>
793+ fail ! ( "attempted to fail in infallible failure handler!" ) ,
794+ JumpToBasicBlock ( basic_block) =>
795+ Br ( bcx, basic_block) ,
796+ Unreachable =>
797+ build:: Unreachable ( bcx)
848798 }
849799 }
850800}
@@ -1005,7 +955,7 @@ fn compile_guard<'a, 'b>(
1005955 // condition explicitly rather than (possibly) falling back to
1006956 // the default arm.
1007957 & JumpToBasicBlock ( _) if m. len ( ) == 1 && has_genuine_default => {
1008- Br ( bcx , chk. handle_fail ( ) ) ;
958+ chk. handle_fail ( bcx ) ;
1009959 }
1010960 _ => {
1011961 compile_submatch ( bcx, m, vals, chk, has_genuine_default) ;
@@ -1030,7 +980,7 @@ fn compile_submatch<'a, 'b>(
1030980 let mut bcx = bcx;
1031981 if m. len ( ) == 0 u {
1032982 if chk. is_fallible ( ) {
1033- Br ( bcx , chk. handle_fail ( ) ) ;
983+ chk. handle_fail ( bcx ) ;
1034984 }
1035985 return ;
1036986 }
@@ -1301,7 +1251,7 @@ fn compile_submatch_continue<'a, 'b>(
13011251 // condition explicitly rather than (eventually) falling back to
13021252 // the last default arm.
13031253 & JumpToBasicBlock ( _) if defaults. len ( ) == 1 && has_genuine_default => {
1304- Br ( else_cx , chk. handle_fail ( ) ) ;
1254+ chk. handle_fail ( else_cx ) ;
13051255 }
13061256 _ => {
13071257 compile_submatch ( else_cx,
@@ -1395,21 +1345,10 @@ fn trans_match_inner<'a>(scope_cx: &'a Block<'a>,
13951345 }
13961346
13971347 let t = node_id_type ( bcx, discr_expr. id ) ;
1398- let chk = {
1399- if ty:: type_is_empty ( tcx, t) {
1400- // Special case for empty types
1401- let fail_cx = Cell :: new ( None ) ;
1402- let fail_handler = box DynamicFailureHandler {
1403- bcx : scope_cx,
1404- sp : discr_expr. span ,
1405- msg : InternedString :: new ( "scrutinizing value that can't \
1406- exist") ,
1407- finished : fail_cx,
1408- } ;
1409- DynamicFailureHandlerClass ( fail_handler)
1410- } else {
1411- Infallible
1412- }
1348+ let chk = if ty:: type_is_empty ( tcx, t) {
1349+ Unreachable
1350+ } else {
1351+ Infallible
14131352 } ;
14141353
14151354 let arm_datas: Vec < ArmData > = arms. iter ( ) . map ( |arm| ArmData {
0 commit comments