@@ -599,7 +599,8 @@ impl<'p, 'tcx> PatStack<'p, 'tcx> {
599599 // an or-pattern. Panics if `self` is empty.
600600 fn expand_or_pat < ' a > ( & ' a self ) -> impl Iterator < Item = PatStack < ' p , ' tcx > > + Captures < ' a > {
601601 self . head ( ) . flatten_or_pat ( ) . into_iter ( ) . map ( move |pat| {
602- let mut new_pats = smallvec ! [ pat] ;
602+ let mut new_pats = SmallVec :: < [ _ ; 2 ] > :: with_capacity ( self . len ( ) ) ;
603+ new_pats. push ( pat) ;
603604 new_pats. extend_from_slice ( & self . pats [ 1 ..] ) ;
604605 PatStack { pats : new_pats }
605606 } )
@@ -614,7 +615,9 @@ impl<'p, 'tcx> PatStack<'p, 'tcx> {
614615 ) -> PatStack < ' p , ' tcx > {
615616 // We pop the head pattern and push the new fields extracted from the arguments of
616617 // `self.head()`.
617- let mut new_pats = self . head ( ) . specialize ( pcx, ctor) ;
618+ let ctor_fields = self . head ( ) . specialize ( pcx, ctor) ;
619+ let mut new_pats = SmallVec :: < [ _ ; 2 ] > :: with_capacity ( self . len ( ) + ctor_fields. len ( ) - 1 ) ;
620+ new_pats. extend_from_slice ( & ctor_fields) ;
618621 new_pats. extend_from_slice ( & self . pats [ 1 ..] ) ;
619622 PatStack { pats : new_pats }
620623 }
@@ -732,18 +735,11 @@ impl<'p, 'tcx> Matrix<'p, 'tcx> {
732735 }
733736
734737 /// Build a new matrix from an iterator of `MatchArm`s.
735- fn new < ' a > (
736- cx : & MatchCheckCtxt < ' p , ' tcx > ,
737- iter : impl Iterator < Item = & ' a MatchArm < ' p , ' tcx > > ,
738- scrut_ty : Ty < ' tcx > ,
739- ) -> Self
740- where
741- ' p : ' a ,
742- {
738+ fn new ( cx : & MatchCheckCtxt < ' p , ' tcx > , arms : & [ MatchArm < ' p , ' tcx > ] , scrut_ty : Ty < ' tcx > ) -> Self {
743739 let wild_pattern = cx. pattern_arena . alloc ( DeconstructedPat :: wildcard ( scrut_ty, DUMMY_SP ) ) ;
744740 let wildcard_row = PatStack :: from_pattern ( wild_pattern) ;
745- let mut matrix = Matrix { rows : vec ! [ ] , wildcard_row } ;
746- for ( row_id, arm) in iter. enumerate ( ) {
741+ let mut matrix = Matrix { rows : Vec :: with_capacity ( arms . len ( ) ) , wildcard_row } ;
742+ for ( row_id, arm) in arms . iter ( ) . enumerate ( ) {
747743 let v = MatrixRow {
748744 pats : PatStack :: from_pattern ( arm. pat ) ,
749745 parent_row : row_id, // dummy, we won't read it
@@ -806,7 +802,8 @@ impl<'p, 'tcx> Matrix<'p, 'tcx> {
806802 ctor : & Constructor < ' tcx > ,
807803 ) -> Matrix < ' p , ' tcx > {
808804 let wildcard_row = self . wildcard_row . pop_head_constructor ( pcx, ctor) ;
809- let mut matrix = Matrix { rows : vec ! [ ] , wildcard_row } ;
805+ let rows = Vec :: with_capacity ( self . rows . len ( ) ) ; // Better waste capacity than reallocate a lot.
806+ let mut matrix = Matrix { rows, wildcard_row } ;
810807 for ( i, row) in self . rows ( ) . enumerate ( ) {
811808 if ctor. is_covered_by ( pcx, row. head ( ) . ctor ( ) ) {
812809 let new_row = row. pop_head_constructor ( pcx, ctor, i) ;
@@ -1386,7 +1383,7 @@ pub(crate) fn compute_match_usefulness<'p, 'tcx>(
13861383 arms : & [ MatchArm < ' p , ' tcx > ] ,
13871384 scrut_ty : Ty < ' tcx > ,
13881385) -> UsefulnessReport < ' p , ' tcx > {
1389- let mut matrix = Matrix :: new ( cx, arms. iter ( ) , scrut_ty) ;
1386+ let mut matrix = Matrix :: new ( cx, arms, scrut_ty) ;
13901387 let non_exhaustiveness_witnesses =
13911388 compute_exhaustiveness_and_reachability ( cx, & mut matrix, true ) ;
13921389
0 commit comments