@@ -616,7 +616,8 @@ fn missing_constructors(cx: &MatchCheckCtxt, &Matrix(ref rows): &Matrix,
616
616
. collect ( ) ;
617
617
all_constructors ( cx, left_ty, max_slice_length)
618
618
. into_iter ( )
619
- . filter ( |c| !used_constructors. contains ( c) ) . collect ( )
619
+ . filter ( |c| !used_constructors. contains ( c) )
620
+ . collect ( )
620
621
}
621
622
622
623
/// This determines the set of all possible constructors of a pattern matching
@@ -695,47 +696,44 @@ fn is_useful(cx: &MatchCheckCtxt,
695
696
696
697
let constructors = pat_constructors ( cx, v[ 0 ] , left_ty, max_slice_length) ;
697
698
if constructors. is_empty ( ) {
698
- match & missing_constructors ( cx, matrix, left_ty, max_slice_length) [ ..] {
699
- [ ] => {
700
- all_constructors ( cx, left_ty, max_slice_length) . into_iter ( ) . map ( |c| {
701
- match is_useful_specialized ( cx, matrix, v, c. clone ( ) , left_ty, witness) {
702
- UsefulWithWitness ( pats) => UsefulWithWitness ( {
703
- let arity = constructor_arity ( cx, & c, left_ty) ;
704
- let mut result = {
705
- let pat_slice = & pats[ ..] ;
706
- let subpats: Vec < _ > = ( 0 ..arity) . map ( |i| {
707
- pat_slice. get ( i) . map_or ( DUMMY_WILD_PAT , |p| & * * p)
708
- } ) . collect ( ) ;
709
- vec ! [ construct_witness( cx, & c, subpats, left_ty) ]
710
- } ;
711
- result. extend ( pats. into_iter ( ) . skip ( arity) ) ;
712
- result
713
- } ) ,
714
- result => result
715
- }
716
- } ) . find ( |result| result != & NotUseful ) . unwrap_or ( NotUseful )
717
- } ,
718
-
719
- [ constructors..] => {
720
- let matrix = rows. iter ( ) . filter_map ( |r| {
721
- if pat_is_binding_or_wild ( & cx. tcx . def_map . borrow ( ) , raw_pat ( r[ 0 ] ) ) {
722
- Some ( r[ 1 ..] . to_vec ( ) )
723
- } else {
724
- None
725
- }
726
- } ) . collect ( ) ;
727
- match is_useful ( cx, & matrix, & v[ 1 ..] , witness) {
728
- UsefulWithWitness ( pats) => {
729
- let mut new_pats: Vec < _ > = constructors. into_iter ( ) . map ( |constructor| {
730
- let arity = constructor_arity ( cx, & constructor, left_ty) ;
731
- let wild_pats = vec ! [ DUMMY_WILD_PAT ; arity] ;
732
- construct_witness ( cx, & constructor, wild_pats, left_ty)
733
- } ) . collect ( ) ;
734
- new_pats. extend ( pats) ;
735
- UsefulWithWitness ( new_pats)
736
- } ,
699
+ let constructors = missing_constructors ( cx, matrix, left_ty, max_slice_length) ;
700
+ if constructors. is_empty ( ) {
701
+ all_constructors ( cx, left_ty, max_slice_length) . into_iter ( ) . map ( |c| {
702
+ match is_useful_specialized ( cx, matrix, v, c. clone ( ) , left_ty, witness) {
703
+ UsefulWithWitness ( pats) => UsefulWithWitness ( {
704
+ let arity = constructor_arity ( cx, & c, left_ty) ;
705
+ let mut result = {
706
+ let pat_slice = & pats[ ..] ;
707
+ let subpats: Vec < _ > = ( 0 ..arity) . map ( |i| {
708
+ pat_slice. get ( i) . map_or ( DUMMY_WILD_PAT , |p| & * * p)
709
+ } ) . collect ( ) ;
710
+ vec ! [ construct_witness( cx, & c, subpats, left_ty) ]
711
+ } ;
712
+ result. extend ( pats. into_iter ( ) . skip ( arity) ) ;
713
+ result
714
+ } ) ,
737
715
result => result
738
716
}
717
+ } ) . find ( |result| result != & NotUseful ) . unwrap_or ( NotUseful )
718
+ } else {
719
+ let matrix = rows. iter ( ) . filter_map ( |r| {
720
+ if pat_is_binding_or_wild ( & cx. tcx . def_map . borrow ( ) , raw_pat ( r[ 0 ] ) ) {
721
+ Some ( r[ 1 ..] . to_vec ( ) )
722
+ } else {
723
+ None
724
+ }
725
+ } ) . collect ( ) ;
726
+ match is_useful ( cx, & matrix, & v[ 1 ..] , witness) {
727
+ UsefulWithWitness ( pats) => {
728
+ let mut new_pats: Vec < _ > = constructors. into_iter ( ) . map ( |constructor| {
729
+ let arity = constructor_arity ( cx, & constructor, left_ty) ;
730
+ let wild_pats = vec ! [ DUMMY_WILD_PAT ; arity] ;
731
+ construct_witness ( cx, & constructor, wild_pats, left_ty)
732
+ } ) . collect ( ) ;
733
+ new_pats. extend ( pats) ;
734
+ UsefulWithWitness ( new_pats)
735
+ } ,
736
+ result => result
739
737
}
740
738
}
741
739
} else {
0 commit comments