1- use smallvec:: SmallVec ;
21use std:: fmt;
32use std:: iter:: once;
43
@@ -27,8 +26,7 @@ use crate::constructor::Constructor::*;
2726pub type Constructor < ' p , ' tcx > = crate :: constructor:: Constructor < RustcMatchCheckCtxt < ' p , ' tcx > > ;
2827pub type ConstructorSet < ' p , ' tcx > =
2928 crate :: constructor:: ConstructorSet < RustcMatchCheckCtxt < ' p , ' tcx > > ;
30- pub type DeconstructedPat < ' p , ' tcx > =
31- crate :: pat:: DeconstructedPat < ' p , RustcMatchCheckCtxt < ' p , ' tcx > > ;
29+ pub type DeconstructedPat < ' p , ' tcx > = crate :: pat:: DeconstructedPat < RustcMatchCheckCtxt < ' p , ' tcx > > ;
3230pub type MatchArm < ' p , ' tcx > = crate :: MatchArm < ' p , RustcMatchCheckCtxt < ' p , ' tcx > > ;
3331pub type Usefulness < ' p , ' tcx > = crate :: usefulness:: Usefulness < ' p , RustcMatchCheckCtxt < ' p , ' tcx > > ;
3432pub type UsefulnessReport < ' p , ' tcx > =
@@ -458,21 +456,20 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
458456 /// Note: the input patterns must have been lowered through
459457 /// `rustc_mir_build::thir::pattern::check_match::MatchVisitor::lower_pattern`.
460458 pub fn lower_pat ( & self , pat : & ' p Pat < ' tcx > ) -> DeconstructedPat < ' p , ' tcx > {
461- let singleton = |pat| std:: slice:: from_ref ( self . pattern_arena . alloc ( pat) ) ;
462459 let cx = self ;
463460 let ty = cx. reveal_opaque_ty ( pat. ty ) ;
464461 let ctor;
465- let fields: & [ _ ] ;
462+ let mut fields: Vec < _ > ;
466463 match & pat. kind {
467464 PatKind :: AscribeUserType { subpattern, .. }
468465 | PatKind :: InlineConstant { subpattern, .. } => return self . lower_pat ( subpattern) ,
469466 PatKind :: Binding { subpattern : Some ( subpat) , .. } => return self . lower_pat ( subpat) ,
470467 PatKind :: Binding { subpattern : None , .. } | PatKind :: Wild => {
471468 ctor = Wildcard ;
472- fields = & [ ] ;
469+ fields = vec ! [ ] ;
473470 }
474471 PatKind :: Deref { subpattern } => {
475- fields = singleton ( self . lower_pat ( subpattern) ) ;
472+ fields = vec ! [ self . lower_pat( subpattern) ] ;
476473 ctor = match ty. kind ( ) {
477474 // This is a box pattern.
478475 ty:: Adt ( adt, ..) if adt. is_box ( ) => Struct ,
@@ -484,15 +481,14 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
484481 match ty. kind ( ) {
485482 ty:: Tuple ( fs) => {
486483 ctor = Struct ;
487- let mut wilds : SmallVec < [ _ ; 2 ] > = fs
484+ fields = fs
488485 . iter ( )
489486 . map ( |ty| cx. reveal_opaque_ty ( ty) )
490487 . map ( |ty| DeconstructedPat :: wildcard ( ty) )
491488 . collect ( ) ;
492489 for pat in subpatterns {
493- wilds [ pat. field . index ( ) ] = self . lower_pat ( & pat. pattern ) ;
490+ fields [ pat. field . index ( ) ] = self . lower_pat ( & pat. pattern ) ;
494491 }
495- fields = cx. pattern_arena . alloc_from_iter ( wilds) ;
496492 }
497493 ty:: Adt ( adt, args) if adt. is_box ( ) => {
498494 // The only legal patterns of type `Box` (outside `std`) are `_` and box
@@ -514,7 +510,7 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
514510 DeconstructedPat :: wildcard ( self . reveal_opaque_ty ( args. type_at ( 0 ) ) )
515511 } ;
516512 ctor = Struct ;
517- fields = singleton ( pat) ;
513+ fields = vec ! [ pat] ;
518514 }
519515 ty:: Adt ( adt, _) => {
520516 ctor = match pat. kind {
@@ -534,14 +530,12 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
534530 ty
535531 } ,
536532 ) ;
537- let mut wilds: SmallVec < [ _ ; 2 ] > =
538- tys. map ( |ty| DeconstructedPat :: wildcard ( ty) ) . collect ( ) ;
533+ fields = tys. map ( |ty| DeconstructedPat :: wildcard ( ty) ) . collect ( ) ;
539534 for pat in subpatterns {
540535 if let Some ( i) = field_id_to_id[ pat. field . index ( ) ] {
541- wilds [ i] = self . lower_pat ( & pat. pattern ) ;
536+ fields [ i] = self . lower_pat ( & pat. pattern ) ;
542537 }
543538 }
544- fields = cx. pattern_arena . alloc_from_iter ( wilds) ;
545539 }
546540 _ => bug ! ( "pattern has unexpected type: pat: {:?}, ty: {:?}" , pat, ty) ,
547541 }
@@ -553,7 +547,7 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
553547 Some ( b) => Bool ( b) ,
554548 None => Opaque ( OpaqueId :: new ( ) ) ,
555549 } ;
556- fields = & [ ] ;
550+ fields = vec ! [ ] ;
557551 }
558552 ty:: Char | ty:: Int ( _) | ty:: Uint ( _) => {
559553 ctor = match value. try_eval_bits ( cx. tcx , cx. param_env ) {
@@ -569,7 +563,7 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
569563 }
570564 None => Opaque ( OpaqueId :: new ( ) ) ,
571565 } ;
572- fields = & [ ] ;
566+ fields = vec ! [ ] ;
573567 }
574568 ty:: Float ( ty:: FloatTy :: F32 ) => {
575569 ctor = match value. try_eval_bits ( cx. tcx , cx. param_env ) {
@@ -580,7 +574,7 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
580574 }
581575 None => Opaque ( OpaqueId :: new ( ) ) ,
582576 } ;
583- fields = & [ ] ;
577+ fields = vec ! [ ] ;
584578 }
585579 ty:: Float ( ty:: FloatTy :: F64 ) => {
586580 ctor = match value. try_eval_bits ( cx. tcx , cx. param_env ) {
@@ -591,7 +585,7 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
591585 }
592586 None => Opaque ( OpaqueId :: new ( ) ) ,
593587 } ;
594- fields = & [ ] ;
588+ fields = vec ! [ ] ;
595589 }
596590 ty:: Ref ( _, t, _) if t. is_str ( ) => {
597591 // We want a `&str` constant to behave like a `Deref` pattern, to be compatible
@@ -602,16 +596,16 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
602596 // subfields.
603597 // Note: `t` is `str`, not `&str`.
604598 let ty = self . reveal_opaque_ty ( * t) ;
605- let subpattern = DeconstructedPat :: new ( Str ( * value) , & [ ] , ty, pat) ;
599+ let subpattern = DeconstructedPat :: new ( Str ( * value) , Vec :: new ( ) , ty, pat) ;
606600 ctor = Ref ;
607- fields = singleton ( subpattern)
601+ fields = vec ! [ subpattern]
608602 }
609603 // All constants that can be structurally matched have already been expanded
610604 // into the corresponding `Pat`s by `const_to_pat`. Constants that remain are
611605 // opaque.
612606 _ => {
613607 ctor = Opaque ( OpaqueId :: new ( ) ) ;
614- fields = & [ ] ;
608+ fields = vec ! [ ] ;
615609 }
616610 }
617611 }
@@ -648,7 +642,7 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
648642 }
649643 _ => bug ! ( "invalid type for range pattern: {}" , ty. inner( ) ) ,
650644 } ;
651- fields = & [ ] ;
645+ fields = vec ! [ ] ;
652646 }
653647 PatKind :: Array { prefix, slice, suffix } | PatKind :: Slice { prefix, slice, suffix } => {
654648 let array_len = match ty. kind ( ) {
@@ -664,25 +658,22 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
664658 SliceKind :: FixedLen ( prefix. len ( ) + suffix. len ( ) )
665659 } ;
666660 ctor = Slice ( Slice :: new ( array_len, kind) ) ;
667- fields = cx. pattern_arena . alloc_from_iter (
668- prefix. iter ( ) . chain ( suffix. iter ( ) ) . map ( |p| self . lower_pat ( & * p) ) ,
669- )
661+ fields = prefix. iter ( ) . chain ( suffix. iter ( ) ) . map ( |p| self . lower_pat ( & * p) ) . collect ( ) ;
670662 }
671663 PatKind :: Or { .. } => {
672664 ctor = Or ;
673665 let pats = expand_or_pat ( pat) ;
674- fields =
675- cx. pattern_arena . alloc_from_iter ( pats. into_iter ( ) . map ( |p| self . lower_pat ( p) ) )
666+ fields = pats. into_iter ( ) . map ( |p| self . lower_pat ( p) ) . collect ( ) ;
676667 }
677668 PatKind :: Never => {
678669 // FIXME(never_patterns): handle `!` in exhaustiveness. This is a sane default
679670 // in the meantime.
680671 ctor = Wildcard ;
681- fields = & [ ] ;
672+ fields = vec ! [ ] ;
682673 }
683674 PatKind :: Error ( _) => {
684675 ctor = Opaque ( OpaqueId :: new ( ) ) ;
685- fields = & [ ] ;
676+ fields = vec ! [ ] ;
686677 }
687678 }
688679 DeconstructedPat :: new ( ctor, fields, ty, pat)
@@ -887,7 +878,7 @@ impl<'p, 'tcx> TypeCx for RustcMatchCheckCtxt<'p, 'tcx> {
887878
888879 fn write_variant_name (
889880 f : & mut fmt:: Formatter < ' _ > ,
890- pat : & crate :: pat:: DeconstructedPat < ' _ , Self > ,
881+ pat : & crate :: pat:: DeconstructedPat < Self > ,
891882 ) -> fmt:: Result {
892883 if let ty:: Adt ( adt, _) = pat. ty ( ) . kind ( ) {
893884 if adt. is_box ( ) {
@@ -906,9 +897,9 @@ impl<'p, 'tcx> TypeCx for RustcMatchCheckCtxt<'p, 'tcx> {
906897
907898 fn lint_overlapping_range_endpoints (
908899 & self ,
909- pat : & crate :: pat:: DeconstructedPat < ' _ , Self > ,
900+ pat : & crate :: pat:: DeconstructedPat < Self > ,
910901 overlaps_on : IntRange ,
911- overlaps_with : & [ & crate :: pat:: DeconstructedPat < ' _ , Self > ] ,
902+ overlaps_with : & [ & crate :: pat:: DeconstructedPat < Self > ] ,
912903 ) {
913904 let overlap_as_pat = self . hoist_pat_range ( & overlaps_on, * pat. ty ( ) ) ;
914905 let overlaps: Vec < _ > = overlaps_with
0 commit comments