@@ -556,19 +556,12 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> {
556
556
self . slice_or_array_pattern ( pat. span , ty, prefix, slice, suffix)
557
557
}
558
558
559
- hir:: PatKind :: Tuple ( ref subpatterns , ddpos) => {
559
+ hir:: PatKind :: Tuple ( ref pats , ddpos) => {
560
560
let tys = match ty. kind {
561
561
ty:: Tuple ( ref tys) => tys,
562
562
_ => span_bug ! ( pat. span, "unexpected type for tuple pattern: {:?}" , ty) ,
563
563
} ;
564
- let subpatterns = subpatterns
565
- . iter ( )
566
- . enumerate_and_adjust ( tys. len ( ) , ddpos)
567
- . map ( |( i, subpattern) | FieldPat {
568
- field : Field :: new ( i) ,
569
- pattern : self . lower_pattern ( subpattern)
570
- } )
571
- . collect ( ) ;
564
+ let subpatterns = self . lower_tuple_subpats ( pats, tys. len ( ) , ddpos) ;
572
565
PatKind :: Leaf { subpatterns }
573
566
}
574
567
@@ -609,25 +602,14 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> {
609
602
}
610
603
}
611
604
612
- hir:: PatKind :: TupleStruct ( ref qpath, ref subpatterns , ddpos) => {
605
+ hir:: PatKind :: TupleStruct ( ref qpath, ref pats , ddpos) => {
613
606
let res = self . tables . qpath_res ( qpath, pat. hir_id ) ;
614
607
let adt_def = match ty. kind {
615
608
ty:: Adt ( adt_def, _) => adt_def,
616
- _ => span_bug ! ( pat. span,
617
- "tuple struct pattern not applied to an ADT {:?}" ,
618
- ty) ,
609
+ _ => span_bug ! ( pat. span, "tuple struct pattern not applied to an ADT {:?}" , ty) ,
619
610
} ;
620
611
let variant_def = adt_def. variant_of_res ( res) ;
621
-
622
- let subpatterns =
623
- subpatterns. iter ( )
624
- . enumerate_and_adjust ( variant_def. fields . len ( ) , ddpos)
625
- . map ( |( i, field) | FieldPat {
626
- field : Field :: new ( i) ,
627
- pattern : self . lower_pattern ( field) ,
628
- } )
629
- . collect ( ) ;
630
-
612
+ let subpatterns = self . lower_tuple_subpats ( pats, variant_def. fields . len ( ) , ddpos) ;
631
613
self . lower_variant_or_leaf ( res, pat. hir_id , pat. span , ty, subpatterns)
632
614
}
633
615
@@ -661,6 +643,21 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> {
661
643
}
662
644
}
663
645
646
+ fn lower_tuple_subpats (
647
+ & mut self ,
648
+ pats : & ' tcx [ P < hir:: Pat > ] ,
649
+ expected_len : usize ,
650
+ gap_pos : Option < usize > ,
651
+ ) -> Vec < FieldPat < ' tcx > > {
652
+ pats. iter ( )
653
+ . enumerate_and_adjust ( expected_len, gap_pos)
654
+ . map ( |( i, subpattern) | FieldPat {
655
+ field : Field :: new ( i) ,
656
+ pattern : self . lower_pattern ( subpattern)
657
+ } )
658
+ . collect ( )
659
+ }
660
+
664
661
fn lower_patterns ( & mut self , pats : & ' tcx [ P < hir:: Pat > ] ) -> Vec < Pat < ' tcx > > {
665
662
pats. iter ( ) . map ( |p| self . lower_pattern ( p) ) . collect ( )
666
663
}
0 commit comments