@@ -261,7 +261,7 @@ impl IntRange {
261261 /// Lint on likely incorrect range patterns (#63987)
262262 pub ( super ) fn lint_overlapping_range_endpoints < ' a , ' p : ' a , ' tcx : ' a > (
263263 & self ,
264- pcx : PatCtxt < ' _ , ' p , ' tcx > ,
264+ pcx : & PatCtxt < ' _ , ' p , ' tcx > ,
265265 pats : impl Iterator < Item = & ' a DeconstructedPat < ' p , ' tcx > > ,
266266 column_count : usize ,
267267 hir_id : HirId ,
@@ -696,7 +696,7 @@ impl<'tcx> Constructor<'tcx> {
696696 /// `EvalResult::Deny { .. }`.
697697 ///
698698 /// This means that the variant has a stdlib unstable feature marking it.
699- pub ( super ) fn is_unstable_variant ( & self , pcx : PatCtxt < ' _ , ' _ , ' tcx > ) -> bool {
699+ pub ( super ) fn is_unstable_variant ( & self , pcx : & PatCtxt < ' _ , ' _ , ' tcx > ) -> bool {
700700 if let Constructor :: Variant ( idx) = self && let ty:: Adt ( adt, _) = pcx. ty . kind ( ) {
701701 let variant_def_id = adt. variant ( * idx) . def_id ;
702702 // Filter variants that depend on a disabled unstable feature.
@@ -710,7 +710,7 @@ impl<'tcx> Constructor<'tcx> {
710710
711711 /// Checks if the `Constructor` is a `Constructor::Variant` with a `#[doc(hidden)]`
712712 /// attribute from a type not local to the current crate.
713- pub ( super ) fn is_doc_hidden_variant ( & self , pcx : PatCtxt < ' _ , ' _ , ' tcx > ) -> bool {
713+ pub ( super ) fn is_doc_hidden_variant ( & self , pcx : & PatCtxt < ' _ , ' _ , ' tcx > ) -> bool {
714714 if let Constructor :: Variant ( idx) = self && let ty:: Adt ( adt, _) = pcx. ty . kind ( ) {
715715 let variant_def_id = adt. variants ( ) [ * idx] . def_id ;
716716 return pcx. cx . tcx . is_doc_hidden ( variant_def_id) && !variant_def_id. is_local ( ) ;
@@ -731,7 +731,7 @@ impl<'tcx> Constructor<'tcx> {
731731
732732 /// The number of fields for this constructor. This must be kept in sync with
733733 /// `Fields::wildcards`.
734- pub ( super ) fn arity ( & self , pcx : PatCtxt < ' _ , ' _ , ' tcx > ) -> usize {
734+ pub ( super ) fn arity ( & self , pcx : & PatCtxt < ' _ , ' _ , ' tcx > ) -> usize {
735735 match self {
736736 Single | Variant ( _) => match pcx. ty . kind ( ) {
737737 ty:: Tuple ( fs) => fs. len ( ) ,
@@ -775,7 +775,7 @@ impl<'tcx> Constructor<'tcx> {
775775 /// matrix, unless all of them are.
776776 pub ( super ) fn split < ' a > (
777777 & self ,
778- pcx : PatCtxt < ' _ , ' _ , ' tcx > ,
778+ pcx : & PatCtxt < ' _ , ' _ , ' tcx > ,
779779 ctors : impl Iterator < Item = & ' a Constructor < ' tcx > > + Clone ,
780780 ) -> SmallVec < [ Self ; 1 ] >
781781 where
@@ -811,7 +811,7 @@ impl<'tcx> Constructor<'tcx> {
811811 /// this checks for inclusion.
812812 // We inline because this has a single call site in `Matrix::specialize_constructor`.
813813 #[ inline]
814- pub ( super ) fn is_covered_by < ' p > ( & self , pcx : PatCtxt < ' _ , ' p , ' tcx > , other : & Self ) -> bool {
814+ pub ( super ) fn is_covered_by < ' p > ( & self , pcx : & PatCtxt < ' _ , ' p , ' tcx > , other : & Self ) -> bool {
815815 // This must be kept in sync with `is_covered_by_any`.
816816 match ( self , other) {
817817 // Wildcards cover anything
@@ -865,7 +865,7 @@ impl<'tcx> Constructor<'tcx> {
865865 /// assumed to have been split from a wildcard.
866866 fn is_covered_by_any < ' p > (
867867 & self ,
868- pcx : PatCtxt < ' _ , ' p , ' tcx > ,
868+ pcx : & PatCtxt < ' _ , ' p , ' tcx > ,
869869 used_ctors : & [ Constructor < ' tcx > ] ,
870870 ) -> bool {
871871 if used_ctors. is_empty ( ) {
@@ -918,7 +918,7 @@ pub(super) struct SplitWildcard<'tcx> {
918918}
919919
920920impl < ' tcx > SplitWildcard < ' tcx > {
921- pub ( super ) fn new < ' p > ( pcx : PatCtxt < ' _ , ' p , ' tcx > ) -> Self {
921+ pub ( super ) fn new < ' p > ( pcx : & PatCtxt < ' _ , ' p , ' tcx > ) -> Self {
922922 debug ! ( "SplitWildcard::new({:?})" , pcx. ty) ;
923923 let cx = pcx. cx ;
924924 let make_range = |start, end| {
@@ -1044,7 +1044,7 @@ impl<'tcx> SplitWildcard<'tcx> {
10441044 /// do what you want.
10451045 pub ( super ) fn split < ' a > (
10461046 & mut self ,
1047- pcx : PatCtxt < ' _ , ' _ , ' tcx > ,
1047+ pcx : & PatCtxt < ' _ , ' _ , ' tcx > ,
10481048 ctors : impl Iterator < Item = & ' a Constructor < ' tcx > > + Clone ,
10491049 ) where
10501050 ' tcx : ' a ,
@@ -1056,21 +1056,21 @@ impl<'tcx> SplitWildcard<'tcx> {
10561056 }
10571057
10581058 /// Whether there are any value constructors for this type that are not present in the matrix.
1059- fn any_missing ( & self , pcx : PatCtxt < ' _ , ' _ , ' tcx > ) -> bool {
1059+ fn any_missing ( & self , pcx : & PatCtxt < ' _ , ' _ , ' tcx > ) -> bool {
10601060 self . iter_missing ( pcx) . next ( ) . is_some ( )
10611061 }
10621062
10631063 /// Iterate over the constructors for this type that are not present in the matrix.
10641064 pub ( super ) fn iter_missing < ' a , ' p > (
10651065 & ' a self ,
1066- pcx : PatCtxt < ' a , ' p , ' tcx > ,
1066+ pcx : & ' a PatCtxt < ' a , ' p , ' tcx > ,
10671067 ) -> impl Iterator < Item = & ' a Constructor < ' tcx > > + Captures < ' p > {
10681068 self . all_ctors . iter ( ) . filter ( move |ctor| !ctor. is_covered_by_any ( pcx, & self . matrix_ctors ) )
10691069 }
10701070
10711071 /// Return the set of constructors resulting from splitting the wildcard. As explained at the
10721072 /// top of the file, if any constructors are missing we can ignore the present ones.
1073- fn into_ctors ( self , pcx : PatCtxt < ' _ , ' _ , ' tcx > ) -> SmallVec < [ Constructor < ' tcx > ; 1 ] > {
1073+ fn into_ctors ( self , pcx : & PatCtxt < ' _ , ' _ , ' tcx > ) -> SmallVec < [ Constructor < ' tcx > ; 1 ] > {
10741074 if self . any_missing ( pcx) {
10751075 // Some constructors are missing, thus we can specialize with the special `Missing`
10761076 // constructor, which stands for those constructors that are not seen in the matrix,
@@ -1202,35 +1202,32 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
12021202
12031203 /// Creates a new list of wildcard fields for a given constructor. The result must have a
12041204 /// length of `constructor.arity()`.
1205- pub ( super ) fn wildcards (
1206- cx : & MatchCheckCtxt < ' p , ' tcx > ,
1207- ty : Ty < ' tcx > ,
1208- constructor : & Constructor < ' tcx > ,
1209- ) -> Self {
1205+ #[ instrument( level = "trace" ) ]
1206+ pub ( super ) fn wildcards ( pcx : & PatCtxt < ' _ , ' p , ' tcx > , constructor : & Constructor < ' tcx > ) -> Self {
12101207 let ret = match constructor {
1211- Single | Variant ( _) => match ty. kind ( ) {
1212- ty:: Tuple ( fs) => Fields :: wildcards_from_tys ( cx, fs. iter ( ) ) ,
1213- ty:: Ref ( _, rty, _) => Fields :: wildcards_from_tys ( cx, once ( * rty) ) ,
1208+ Single | Variant ( _) => match pcx . ty . kind ( ) {
1209+ ty:: Tuple ( fs) => Fields :: wildcards_from_tys ( pcx . cx , fs. iter ( ) ) ,
1210+ ty:: Ref ( _, rty, _) => Fields :: wildcards_from_tys ( pcx . cx , once ( * rty) ) ,
12141211 ty:: Adt ( adt, substs) => {
12151212 if adt. is_box ( ) {
12161213 // The only legal patterns of type `Box` (outside `std`) are `_` and box
12171214 // patterns. If we're here we can assume this is a box pattern.
1218- Fields :: wildcards_from_tys ( cx, once ( substs. type_at ( 0 ) ) )
1215+ Fields :: wildcards_from_tys ( pcx . cx , once ( substs. type_at ( 0 ) ) )
12191216 } else {
12201217 let variant = & adt. variant ( constructor. variant_index_for_adt ( * adt) ) ;
1221- let tys = Fields :: list_variant_nonhidden_fields ( cx, ty, variant)
1218+ let tys = Fields :: list_variant_nonhidden_fields ( pcx . cx , pcx . ty , variant)
12221219 . map ( |( _, ty) | ty) ;
1223- Fields :: wildcards_from_tys ( cx, tys)
1220+ Fields :: wildcards_from_tys ( pcx . cx , tys)
12241221 }
12251222 }
1226- _ => bug ! ( "Unexpected type for `Single` constructor: {:?}" , ty ) ,
1223+ _ => bug ! ( "Unexpected type for `Single` constructor: {:?}" , pcx ) ,
12271224 } ,
1228- Slice ( slice) => match * ty. kind ( ) {
1225+ Slice ( slice) => match * pcx . ty . kind ( ) {
12291226 ty:: Slice ( ty) | ty:: Array ( ty, _) => {
12301227 let arity = slice. arity ( ) ;
1231- Fields :: wildcards_from_tys ( cx, ( 0 ..arity) . map ( |_| ty) )
1228+ Fields :: wildcards_from_tys ( pcx . cx , ( 0 ..arity) . map ( |_| ty) )
12321229 }
1233- _ => bug ! ( "bad slice pattern {:?} {:?}" , constructor, ty ) ,
1230+ _ => bug ! ( "bad slice pattern {:?} {:?}" , constructor, pcx ) ,
12341231 } ,
12351232 Str ( ..)
12361233 | FloatRange ( ..)
@@ -1243,7 +1240,7 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
12431240 bug ! ( "called `Fields::wildcards` on an `Or` ctor" )
12441241 }
12451242 } ;
1246- debug ! ( "Fields::wildcards({:?}, {:?}) = {:#?}" , constructor , ty , ret) ;
1243+ debug ! ( ? ret) ;
12471244 ret
12481245 }
12491246
@@ -1285,8 +1282,8 @@ impl<'p, 'tcx> DeconstructedPat<'p, 'tcx> {
12851282 /// Construct a pattern that matches everything that starts with this constructor.
12861283 /// For example, if `ctor` is a `Constructor::Variant` for `Option::Some`, we get the pattern
12871284 /// `Some(_)`.
1288- pub ( super ) fn wild_from_ctor ( pcx : PatCtxt < ' _ , ' p , ' tcx > , ctor : Constructor < ' tcx > ) -> Self {
1289- let fields = Fields :: wildcards ( pcx. cx , pcx . ty , & ctor) ;
1285+ pub ( super ) fn wild_from_ctor ( pcx : & PatCtxt < ' _ , ' p , ' tcx > , ctor : Constructor < ' tcx > ) -> Self {
1286+ let fields = Fields :: wildcards ( pcx, & ctor) ;
12901287 DeconstructedPat :: new ( ctor, fields, pcx. ty , DUMMY_SP )
12911288 }
12921289
@@ -1553,13 +1550,13 @@ impl<'p, 'tcx> DeconstructedPat<'p, 'tcx> {
15531550 /// `other_ctor` can be different from `self.ctor`, but must be covered by it.
15541551 pub ( super ) fn specialize < ' a > (
15551552 & ' a self ,
1556- cx : & MatchCheckCtxt < ' p , ' tcx > ,
1553+ pcx : & PatCtxt < ' _ , ' p , ' tcx > ,
15571554 other_ctor : & Constructor < ' tcx > ,
15581555 ) -> SmallVec < [ & ' p DeconstructedPat < ' p , ' tcx > ; 2 ] > {
15591556 match ( & self . ctor , other_ctor) {
15601557 ( Wildcard , _) => {
15611558 // We return a wildcard for each field of `other_ctor`.
1562- Fields :: wildcards ( cx , self . ty , other_ctor) . iter_patterns ( ) . collect ( )
1559+ Fields :: wildcards ( pcx , other_ctor) . iter_patterns ( ) . collect ( )
15631560 }
15641561 ( Slice ( self_slice) , Slice ( other_slice) )
15651562 if self_slice. arity ( ) != other_slice. arity ( ) =>
@@ -1578,7 +1575,7 @@ impl<'p, 'tcx> DeconstructedPat<'p, 'tcx> {
15781575 let prefix = & self . fields . fields [ ..prefix] ;
15791576 let suffix = & self . fields . fields [ self_slice. arity ( ) - suffix..] ;
15801577 let wildcard: & _ =
1581- cx. pattern_arena . alloc ( DeconstructedPat :: wildcard ( inner_ty) ) ;
1578+ pcx . cx . pattern_arena . alloc ( DeconstructedPat :: wildcard ( inner_ty) ) ;
15821579 let extra_wildcards = other_slice. arity ( ) - self_slice. arity ( ) ;
15831580 let extra_wildcards = ( 0 ..extra_wildcards) . map ( |_| wildcard) ;
15841581 prefix. iter ( ) . chain ( extra_wildcards) . chain ( suffix) . collect ( )
0 commit comments