@@ -990,8 +990,8 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
990990
991991 /// Construct a new `Fields` from the given patterns. You must be sure those patterns can't
992992 /// contain fields that need to be filtered out. When in doubt, prefer `replace_fields`.
993- fn from_vec_unfiltered ( pats : SmallVec < [ & ' p Pat < ' tcx > ; 2 ] > ) -> Self {
994- Fields :: Vec ( pats)
993+ fn from_slice_unfiltered ( pats : & ' p [ Pat < ' tcx > ] ) -> Self {
994+ Fields :: Slice ( pats)
995995 }
996996
997997 /// Convenience; internal use.
@@ -2537,20 +2537,23 @@ fn specialize_one_pattern<'p, 'tcx>(
25372537 if ctor_wild_subpatterns. len ( ) as u64 != n {
25382538 return None ;
25392539 }
2540+
25402541 // Convert a constant slice/array pattern to a list of patterns.
25412542 let layout = cx. tcx . layout_of ( cx. param_env . and ( ty) ) . ok ( ) ?;
25422543 let ptr = Pointer :: new ( AllocId ( 0 ) , offset) ;
2543- let pats = ( 0 ..n)
2544- . map ( |i| {
2545- let ptr = ptr. offset ( layout. size * i, & cx. tcx ) . ok ( ) ?;
2546- let scalar = alloc. read_scalar ( & cx. tcx , ptr, layout. size ) . ok ( ) ?;
2547- let scalar = scalar. not_undef ( ) . ok ( ) ?;
2548- let value = ty:: Const :: from_scalar ( cx. tcx , scalar, ty) ;
2549- let pattern = Pat { ty, span : pat. span , kind : box PatKind :: Constant { value } } ;
2550- Some ( & * cx. pattern_arena . alloc ( pattern) )
2551- } )
2552- . collect :: < Option < _ > > ( ) ?;
2553- Some ( Fields :: from_vec_unfiltered ( pats) )
2544+ let pats = cx. pattern_arena . alloc_from_iter ( ( 0 ..n) . filter_map ( |i| {
2545+ let ptr = ptr. offset ( layout. size * i, & cx. tcx ) . ok ( ) ?;
2546+ let scalar = alloc. read_scalar ( & cx. tcx , ptr, layout. size ) . ok ( ) ?;
2547+ let scalar = scalar. not_undef ( ) . ok ( ) ?;
2548+ let value = ty:: Const :: from_scalar ( cx. tcx , scalar, ty) ;
2549+ let pattern = Pat { ty, span : pat. span , kind : box PatKind :: Constant { value } } ;
2550+ Some ( pattern)
2551+ } ) ) ;
2552+ // Ensure none of the dereferences failed.
2553+ if pats. len ( ) as u64 != n {
2554+ return None ;
2555+ }
2556+ Some ( Fields :: from_slice_unfiltered ( pats) )
25542557 }
25552558
25562559 PatKind :: Constant { .. } | PatKind :: Range { .. } => {
0 commit comments