1- use smallvec:: SmallVec ;
21use std:: fmt;
32use std:: iter:: once;
43
@@ -28,8 +27,7 @@ use crate::constructor::Constructor::*;
2827pub type Constructor < ' p , ' tcx > = crate :: constructor:: Constructor < RustcMatchCheckCtxt < ' p , ' tcx > > ;
2928pub type ConstructorSet < ' p , ' tcx > =
3029 crate :: constructor:: ConstructorSet < RustcMatchCheckCtxt < ' p , ' tcx > > ;
31- pub type DeconstructedPat < ' p , ' tcx > =
32- crate :: pat:: DeconstructedPat < ' p , RustcMatchCheckCtxt < ' p , ' tcx > > ;
30+ pub type DeconstructedPat < ' p , ' tcx > = crate :: pat:: DeconstructedPat < RustcMatchCheckCtxt < ' p , ' tcx > > ;
3331pub type MatchArm < ' p , ' tcx > = crate :: MatchArm < ' p , RustcMatchCheckCtxt < ' p , ' tcx > > ;
3432pub type Usefulness < ' p , ' tcx > = crate :: usefulness:: Usefulness < ' p , RustcMatchCheckCtxt < ' p , ' tcx > > ;
3533pub type UsefulnessReport < ' p , ' tcx > =
@@ -452,21 +450,20 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
452450 /// Note: the input patterns must have been lowered through
453451 /// `rustc_mir_build::thir::pattern::check_match::MatchVisitor::lower_pattern`.
454452 pub fn lower_pat ( & self , pat : & ' p Pat < ' tcx > ) -> DeconstructedPat < ' p , ' tcx > {
455- let singleton = |pat| std:: slice:: from_ref ( self . pattern_arena . alloc ( pat) ) ;
456453 let cx = self ;
457454 let ty = cx. reveal_opaque_ty ( pat. ty ) ;
458455 let ctor;
459- let fields: & [ _ ] ;
456+ let mut fields: Vec < _ > ;
460457 match & pat. kind {
461458 PatKind :: AscribeUserType { subpattern, .. }
462459 | PatKind :: InlineConstant { subpattern, .. } => return self . lower_pat ( subpattern) ,
463460 PatKind :: Binding { subpattern : Some ( subpat) , .. } => return self . lower_pat ( subpat) ,
464461 PatKind :: Binding { subpattern : None , .. } | PatKind :: Wild => {
465462 ctor = Wildcard ;
466- fields = & [ ] ;
463+ fields = vec ! [ ] ;
467464 }
468465 PatKind :: Deref { subpattern } => {
469- fields = singleton ( self . lower_pat ( subpattern) ) ;
466+ fields = vec ! [ self . lower_pat( subpattern) ] ;
470467 ctor = match ty. kind ( ) {
471468 // This is a box pattern.
472469 ty:: Adt ( adt, ..) if adt. is_box ( ) => Struct ,
@@ -478,15 +475,14 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
478475 match ty. kind ( ) {
479476 ty:: Tuple ( fs) => {
480477 ctor = Struct ;
481- let mut wilds : SmallVec < [ _ ; 2 ] > = fs
478+ fields = fs
482479 . iter ( )
483480 . map ( |ty| cx. reveal_opaque_ty ( ty) )
484481 . map ( |ty| DeconstructedPat :: wildcard ( ty) )
485482 . collect ( ) ;
486483 for pat in subpatterns {
487- wilds [ pat. field . index ( ) ] = self . lower_pat ( & pat. pattern ) ;
484+ fields [ pat. field . index ( ) ] = self . lower_pat ( & pat. pattern ) ;
488485 }
489- fields = cx. pattern_arena . alloc_from_iter ( wilds) ;
490486 }
491487 ty:: Adt ( adt, args) if adt. is_box ( ) => {
492488 // The only legal patterns of type `Box` (outside `std`) are `_` and box
@@ -508,7 +504,7 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
508504 DeconstructedPat :: wildcard ( self . reveal_opaque_ty ( args. type_at ( 0 ) ) )
509505 } ;
510506 ctor = Struct ;
511- fields = singleton ( pat) ;
507+ fields = vec ! [ pat] ;
512508 }
513509 ty:: Adt ( adt, _) => {
514510 ctor = match pat. kind {
@@ -528,14 +524,12 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
528524 ty
529525 } ,
530526 ) ;
531- let mut wilds: SmallVec < [ _ ; 2 ] > =
532- tys. map ( |ty| DeconstructedPat :: wildcard ( ty) ) . collect ( ) ;
527+ fields = tys. map ( |ty| DeconstructedPat :: wildcard ( ty) ) . collect ( ) ;
533528 for pat in subpatterns {
534529 if let Some ( i) = field_id_to_id[ pat. field . index ( ) ] {
535- wilds [ i] = self . lower_pat ( & pat. pattern ) ;
530+ fields [ i] = self . lower_pat ( & pat. pattern ) ;
536531 }
537532 }
538- fields = cx. pattern_arena . alloc_from_iter ( wilds) ;
539533 }
540534 _ => bug ! ( "pattern has unexpected type: pat: {:?}, ty: {:?}" , pat, ty) ,
541535 }
@@ -547,7 +541,7 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
547541 Some ( b) => Bool ( b) ,
548542 None => Opaque ( OpaqueId :: new ( ) ) ,
549543 } ;
550- fields = & [ ] ;
544+ fields = vec ! [ ] ;
551545 }
552546 ty:: Char | ty:: Int ( _) | ty:: Uint ( _) => {
553547 ctor = match value. try_eval_bits ( cx. tcx , cx. param_env ) {
@@ -563,7 +557,7 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
563557 }
564558 None => Opaque ( OpaqueId :: new ( ) ) ,
565559 } ;
566- fields = & [ ] ;
560+ fields = vec ! [ ] ;
567561 }
568562 ty:: Float ( ty:: FloatTy :: F32 ) => {
569563 ctor = match value. try_eval_bits ( cx. tcx , cx. param_env ) {
@@ -574,7 +568,7 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
574568 }
575569 None => Opaque ( OpaqueId :: new ( ) ) ,
576570 } ;
577- fields = & [ ] ;
571+ fields = vec ! [ ] ;
578572 }
579573 ty:: Float ( ty:: FloatTy :: F64 ) => {
580574 ctor = match value. try_eval_bits ( cx. tcx , cx. param_env ) {
@@ -585,7 +579,7 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
585579 }
586580 None => Opaque ( OpaqueId :: new ( ) ) ,
587581 } ;
588- fields = & [ ] ;
582+ fields = vec ! [ ] ;
589583 }
590584 ty:: Ref ( _, t, _) if t. is_str ( ) => {
591585 // We want a `&str` constant to behave like a `Deref` pattern, to be compatible
@@ -596,16 +590,16 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
596590 // subfields.
597591 // Note: `t` is `str`, not `&str`.
598592 let ty = self . reveal_opaque_ty ( * t) ;
599- let subpattern = DeconstructedPat :: new ( Str ( * value) , & [ ] , ty, pat) ;
593+ let subpattern = DeconstructedPat :: new ( Str ( * value) , Vec :: new ( ) , ty, pat) ;
600594 ctor = Ref ;
601- fields = singleton ( subpattern)
595+ fields = vec ! [ subpattern]
602596 }
603597 // All constants that can be structurally matched have already been expanded
604598 // into the corresponding `Pat`s by `const_to_pat`. Constants that remain are
605599 // opaque.
606600 _ => {
607601 ctor = Opaque ( OpaqueId :: new ( ) ) ;
608- fields = & [ ] ;
602+ fields = vec ! [ ] ;
609603 }
610604 }
611605 }
@@ -642,7 +636,7 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
642636 }
643637 _ => bug ! ( "invalid type for range pattern: {}" , ty. inner( ) ) ,
644638 } ;
645- fields = & [ ] ;
639+ fields = vec ! [ ] ;
646640 }
647641 PatKind :: Array { prefix, slice, suffix } | PatKind :: Slice { prefix, slice, suffix } => {
648642 let array_len = match ty. kind ( ) {
@@ -658,25 +652,22 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
658652 SliceKind :: FixedLen ( prefix. len ( ) + suffix. len ( ) )
659653 } ;
660654 ctor = Slice ( Slice :: new ( array_len, kind) ) ;
661- fields = cx. pattern_arena . alloc_from_iter (
662- prefix. iter ( ) . chain ( suffix. iter ( ) ) . map ( |p| self . lower_pat ( & * p) ) ,
663- )
655+ fields = prefix. iter ( ) . chain ( suffix. iter ( ) ) . map ( |p| self . lower_pat ( & * p) ) . collect ( ) ;
664656 }
665657 PatKind :: Or { .. } => {
666658 ctor = Or ;
667659 let pats = expand_or_pat ( pat) ;
668- fields =
669- cx. pattern_arena . alloc_from_iter ( pats. into_iter ( ) . map ( |p| self . lower_pat ( p) ) )
660+ fields = pats. into_iter ( ) . map ( |p| self . lower_pat ( p) ) . collect ( ) ;
670661 }
671662 PatKind :: Never => {
672663 // FIXME(never_patterns): handle `!` in exhaustiveness. This is a sane default
673664 // in the meantime.
674665 ctor = Wildcard ;
675- fields = & [ ] ;
666+ fields = vec ! [ ] ;
676667 }
677668 PatKind :: Error ( _) => {
678669 ctor = Opaque ( OpaqueId :: new ( ) ) ;
679- fields = & [ ] ;
670+ fields = vec ! [ ] ;
680671 }
681672 }
682673 DeconstructedPat :: new ( ctor, fields, ty, pat)
@@ -849,7 +840,7 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
849840 /// Best-effort `Debug` implementation.
850841 pub ( crate ) fn debug_pat (
851842 f : & mut fmt:: Formatter < ' _ > ,
852- pat : & crate :: pat:: DeconstructedPat < ' _ , Self > ,
843+ pat : & crate :: pat:: DeconstructedPat < Self > ,
853844 ) -> fmt:: Result {
854845 let mut first = true ;
855846 let mut start_or_continue = |s| {
@@ -975,7 +966,7 @@ impl<'p, 'tcx> TypeCx for RustcMatchCheckCtxt<'p, 'tcx> {
975966
976967 fn debug_pat (
977968 f : & mut fmt:: Formatter < ' _ > ,
978- pat : & crate :: pat:: DeconstructedPat < ' _ , Self > ,
969+ pat : & crate :: pat:: DeconstructedPat < Self > ,
979970 ) -> fmt:: Result {
980971 Self :: debug_pat ( f, pat)
981972 }
@@ -985,9 +976,9 @@ impl<'p, 'tcx> TypeCx for RustcMatchCheckCtxt<'p, 'tcx> {
985976
986977 fn lint_overlapping_range_endpoints (
987978 & self ,
988- pat : & crate :: pat:: DeconstructedPat < ' _ , Self > ,
979+ pat : & crate :: pat:: DeconstructedPat < Self > ,
989980 overlaps_on : IntRange ,
990- overlaps_with : & [ & crate :: pat:: DeconstructedPat < ' _ , Self > ] ,
981+ overlaps_with : & [ & crate :: pat:: DeconstructedPat < Self > ] ,
991982 ) {
992983 let overlap_as_pat = self . hoist_pat_range ( & overlaps_on, * pat. ty ( ) ) ;
993984 let overlaps: Vec < _ > = overlaps_with
0 commit comments