@@ -990,8 +990,8 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
990
990
991
991
/// Construct a new `Fields` from the given patterns. You must be sure those patterns can't
992
992
/// 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)
995
995
}
996
996
997
997
/// Convenience; internal use.
@@ -2537,20 +2537,23 @@ fn specialize_one_pattern<'p, 'tcx>(
2537
2537
if ctor_wild_subpatterns. len ( ) as u64 != n {
2538
2538
return None ;
2539
2539
}
2540
+
2540
2541
// Convert a constant slice/array pattern to a list of patterns.
2541
2542
let layout = cx. tcx . layout_of ( cx. param_env . and ( ty) ) . ok ( ) ?;
2542
2543
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) )
2554
2557
}
2555
2558
2556
2559
PatKind :: Constant { .. } | PatKind :: Range { .. } => {
0 commit comments