1
- use smallvec:: SmallVec ;
2
1
use std:: fmt;
3
2
use std:: iter:: once;
4
3
@@ -27,8 +26,7 @@ use crate::constructor::Constructor::*;
27
26
pub type Constructor < ' p , ' tcx > = crate :: constructor:: Constructor < RustcMatchCheckCtxt < ' p , ' tcx > > ;
28
27
pub type ConstructorSet < ' p , ' tcx > =
29
28
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 > > ;
32
30
pub type MatchArm < ' p , ' tcx > = crate :: MatchArm < ' p , RustcMatchCheckCtxt < ' p , ' tcx > > ;
33
31
pub type Usefulness < ' p , ' tcx > = crate :: usefulness:: Usefulness < ' p , RustcMatchCheckCtxt < ' p , ' tcx > > ;
34
32
pub type UsefulnessReport < ' p , ' tcx > =
@@ -458,21 +456,20 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
458
456
/// Note: the input patterns must have been lowered through
459
457
/// `rustc_mir_build::thir::pattern::check_match::MatchVisitor::lower_pattern`.
460
458
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) ) ;
462
459
let cx = self ;
463
460
let ty = cx. reveal_opaque_ty ( pat. ty ) ;
464
461
let ctor;
465
- let fields: & [ _ ] ;
462
+ let mut fields: Vec < _ > ;
466
463
match & pat. kind {
467
464
PatKind :: AscribeUserType { subpattern, .. }
468
465
| PatKind :: InlineConstant { subpattern, .. } => return self . lower_pat ( subpattern) ,
469
466
PatKind :: Binding { subpattern : Some ( subpat) , .. } => return self . lower_pat ( subpat) ,
470
467
PatKind :: Binding { subpattern : None , .. } | PatKind :: Wild => {
471
468
ctor = Wildcard ;
472
- fields = & [ ] ;
469
+ fields = vec ! [ ] ;
473
470
}
474
471
PatKind :: Deref { subpattern } => {
475
- fields = singleton ( self . lower_pat ( subpattern) ) ;
472
+ fields = vec ! [ self . lower_pat( subpattern) ] ;
476
473
ctor = match ty. kind ( ) {
477
474
// This is a box pattern.
478
475
ty:: Adt ( adt, ..) if adt. is_box ( ) => Struct ,
@@ -484,15 +481,14 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
484
481
match ty. kind ( ) {
485
482
ty:: Tuple ( fs) => {
486
483
ctor = Struct ;
487
- let mut wilds : SmallVec < [ _ ; 2 ] > = fs
484
+ fields = fs
488
485
. iter ( )
489
486
. map ( |ty| cx. reveal_opaque_ty ( ty) )
490
487
. map ( |ty| DeconstructedPat :: wildcard ( ty) )
491
488
. collect ( ) ;
492
489
for pat in subpatterns {
493
- wilds [ pat. field . index ( ) ] = self . lower_pat ( & pat. pattern ) ;
490
+ fields [ pat. field . index ( ) ] = self . lower_pat ( & pat. pattern ) ;
494
491
}
495
- fields = cx. pattern_arena . alloc_from_iter ( wilds) ;
496
492
}
497
493
ty:: Adt ( adt, args) if adt. is_box ( ) => {
498
494
// The only legal patterns of type `Box` (outside `std`) are `_` and box
@@ -514,7 +510,7 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
514
510
DeconstructedPat :: wildcard ( self . reveal_opaque_ty ( args. type_at ( 0 ) ) )
515
511
} ;
516
512
ctor = Struct ;
517
- fields = singleton ( pat) ;
513
+ fields = vec ! [ pat] ;
518
514
}
519
515
ty:: Adt ( adt, _) => {
520
516
ctor = match pat. kind {
@@ -534,14 +530,12 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
534
530
ty
535
531
} ,
536
532
) ;
537
- let mut wilds: SmallVec < [ _ ; 2 ] > =
538
- tys. map ( |ty| DeconstructedPat :: wildcard ( ty) ) . collect ( ) ;
533
+ fields = tys. map ( |ty| DeconstructedPat :: wildcard ( ty) ) . collect ( ) ;
539
534
for pat in subpatterns {
540
535
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 ) ;
542
537
}
543
538
}
544
- fields = cx. pattern_arena . alloc_from_iter ( wilds) ;
545
539
}
546
540
_ => bug ! ( "pattern has unexpected type: pat: {:?}, ty: {:?}" , pat, ty) ,
547
541
}
@@ -553,7 +547,7 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
553
547
Some ( b) => Bool ( b) ,
554
548
None => Opaque ( OpaqueId :: new ( ) ) ,
555
549
} ;
556
- fields = & [ ] ;
550
+ fields = vec ! [ ] ;
557
551
}
558
552
ty:: Char | ty:: Int ( _) | ty:: Uint ( _) => {
559
553
ctor = match value. try_eval_bits ( cx. tcx , cx. param_env ) {
@@ -569,7 +563,7 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
569
563
}
570
564
None => Opaque ( OpaqueId :: new ( ) ) ,
571
565
} ;
572
- fields = & [ ] ;
566
+ fields = vec ! [ ] ;
573
567
}
574
568
ty:: Float ( ty:: FloatTy :: F32 ) => {
575
569
ctor = match value. try_eval_bits ( cx. tcx , cx. param_env ) {
@@ -580,7 +574,7 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
580
574
}
581
575
None => Opaque ( OpaqueId :: new ( ) ) ,
582
576
} ;
583
- fields = & [ ] ;
577
+ fields = vec ! [ ] ;
584
578
}
585
579
ty:: Float ( ty:: FloatTy :: F64 ) => {
586
580
ctor = match value. try_eval_bits ( cx. tcx , cx. param_env ) {
@@ -591,7 +585,7 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
591
585
}
592
586
None => Opaque ( OpaqueId :: new ( ) ) ,
593
587
} ;
594
- fields = & [ ] ;
588
+ fields = vec ! [ ] ;
595
589
}
596
590
ty:: Ref ( _, t, _) if t. is_str ( ) => {
597
591
// We want a `&str` constant to behave like a `Deref` pattern, to be compatible
@@ -602,16 +596,16 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
602
596
// subfields.
603
597
// Note: `t` is `str`, not `&str`.
604
598
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) ;
606
600
ctor = Ref ;
607
- fields = singleton ( subpattern)
601
+ fields = vec ! [ subpattern]
608
602
}
609
603
// All constants that can be structurally matched have already been expanded
610
604
// into the corresponding `Pat`s by `const_to_pat`. Constants that remain are
611
605
// opaque.
612
606
_ => {
613
607
ctor = Opaque ( OpaqueId :: new ( ) ) ;
614
- fields = & [ ] ;
608
+ fields = vec ! [ ] ;
615
609
}
616
610
}
617
611
}
@@ -648,7 +642,7 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
648
642
}
649
643
_ => bug ! ( "invalid type for range pattern: {}" , ty. inner( ) ) ,
650
644
} ;
651
- fields = & [ ] ;
645
+ fields = vec ! [ ] ;
652
646
}
653
647
PatKind :: Array { prefix, slice, suffix } | PatKind :: Slice { prefix, slice, suffix } => {
654
648
let array_len = match ty. kind ( ) {
@@ -664,25 +658,22 @@ impl<'p, 'tcx> RustcMatchCheckCtxt<'p, 'tcx> {
664
658
SliceKind :: FixedLen ( prefix. len ( ) + suffix. len ( ) )
665
659
} ;
666
660
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 ( ) ;
670
662
}
671
663
PatKind :: Or { .. } => {
672
664
ctor = Or ;
673
665
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 ( ) ;
676
667
}
677
668
PatKind :: Never => {
678
669
// FIXME(never_patterns): handle `!` in exhaustiveness. This is a sane default
679
670
// in the meantime.
680
671
ctor = Wildcard ;
681
- fields = & [ ] ;
672
+ fields = vec ! [ ] ;
682
673
}
683
674
PatKind :: Error ( _) => {
684
675
ctor = Opaque ( OpaqueId :: new ( ) ) ;
685
- fields = & [ ] ;
676
+ fields = vec ! [ ] ;
686
677
}
687
678
}
688
679
DeconstructedPat :: new ( ctor, fields, ty, pat)
@@ -887,7 +878,7 @@ impl<'p, 'tcx> TypeCx for RustcMatchCheckCtxt<'p, 'tcx> {
887
878
888
879
fn write_variant_name (
889
880
f : & mut fmt:: Formatter < ' _ > ,
890
- pat : & crate :: pat:: DeconstructedPat < ' _ , Self > ,
881
+ pat : & crate :: pat:: DeconstructedPat < Self > ,
891
882
) -> fmt:: Result {
892
883
if let ty:: Adt ( adt, _) = pat. ty ( ) . kind ( ) {
893
884
if adt. is_box ( ) {
@@ -906,9 +897,9 @@ impl<'p, 'tcx> TypeCx for RustcMatchCheckCtxt<'p, 'tcx> {
906
897
907
898
fn lint_overlapping_range_endpoints (
908
899
& self ,
909
- pat : & crate :: pat:: DeconstructedPat < ' _ , Self > ,
900
+ pat : & crate :: pat:: DeconstructedPat < Self > ,
910
901
overlaps_on : IntRange ,
911
- overlaps_with : & [ & crate :: pat:: DeconstructedPat < ' _ , Self > ] ,
902
+ overlaps_with : & [ & crate :: pat:: DeconstructedPat < Self > ] ,
912
903
) {
913
904
let overlap_as_pat = self . hoist_pat_range ( & overlaps_on, * pat. ty ( ) ) ;
914
905
let overlaps: Vec < _ > = overlaps_with
0 commit comments