@@ -324,6 +324,52 @@ use smallvec::{smallvec, SmallVec};
324
324
use std:: fmt;
325
325
use std:: iter:: { FromIterator , IntoIterator } ;
326
326
327
+ crate struct MatchCheckCtxt < ' a , ' tcx > {
328
+ crate tcx : TyCtxt < ' tcx > ,
329
+ /// The module in which the match occurs. This is necessary for
330
+ /// checking inhabited-ness of types because whether a type is (visibly)
331
+ /// inhabited can depend on whether it was defined in the current module or
332
+ /// not. E.g., `struct Foo { _private: ! }` cannot be seen to be empty
333
+ /// outside its module and should not be matchable with an empty match statement.
334
+ crate module : DefId ,
335
+ crate param_env : ty:: ParamEnv < ' tcx > ,
336
+ crate pattern_arena : & ' a TypedArena < Pat < ' tcx > > ,
337
+ }
338
+
339
+ impl < ' a , ' tcx > MatchCheckCtxt < ' a , ' tcx > {
340
+ pub ( super ) fn is_uninhabited ( & self , ty : Ty < ' tcx > ) -> bool {
341
+ if self . tcx . features ( ) . exhaustive_patterns {
342
+ self . tcx . is_ty_uninhabited_from ( self . module , ty, self . param_env )
343
+ } else {
344
+ false
345
+ }
346
+ }
347
+
348
+ /// Returns whether the given type is an enum from another crate declared `#[non_exhaustive]`.
349
+ pub ( super ) fn is_foreign_non_exhaustive_enum ( & self , ty : Ty < ' tcx > ) -> bool {
350
+ match ty. kind ( ) {
351
+ ty:: Adt ( def, ..) => {
352
+ def. is_enum ( ) && def. is_variant_list_non_exhaustive ( ) && !def. did . is_local ( )
353
+ }
354
+ _ => false ,
355
+ }
356
+ }
357
+ }
358
+
359
+ #[ derive( Copy , Clone ) ]
360
+ pub ( super ) struct PatCtxt < ' a , ' p , ' tcx > {
361
+ pub ( super ) cx : & ' a MatchCheckCtxt < ' p , ' tcx > ,
362
+ /// Current state of the matrix.
363
+ pub ( super ) matrix : & ' a Matrix < ' p , ' tcx > ,
364
+ /// Type of the current column under investigation.
365
+ pub ( super ) ty : Ty < ' tcx > ,
366
+ /// Span of the current pattern under investigation.
367
+ pub ( super ) span : Span ,
368
+ /// Whether the current pattern is the whole pattern as found in a match arm, or if it's a
369
+ /// subpattern.
370
+ pub ( super ) is_top_level : bool ,
371
+ }
372
+
327
373
crate fn expand_pattern < ' tcx > ( pat : Pat < ' tcx > ) -> Pat < ' tcx > {
328
374
LiteralExpander . fold_pattern ( & pat)
329
375
}
@@ -572,39 +618,6 @@ impl<'p, 'tcx> FromIterator<PatStack<'p, 'tcx>> for Matrix<'p, 'tcx> {
572
618
}
573
619
}
574
620
575
- crate struct MatchCheckCtxt < ' a , ' tcx > {
576
- crate tcx : TyCtxt < ' tcx > ,
577
- /// The module in which the match occurs. This is necessary for
578
- /// checking inhabited-ness of types because whether a type is (visibly)
579
- /// inhabited can depend on whether it was defined in the current module or
580
- /// not. E.g., `struct Foo { _private: ! }` cannot be seen to be empty
581
- /// outside it's module and should not be matchable with an empty match
582
- /// statement.
583
- crate module : DefId ,
584
- crate param_env : ty:: ParamEnv < ' tcx > ,
585
- crate pattern_arena : & ' a TypedArena < Pat < ' tcx > > ,
586
- }
587
-
588
- impl < ' a , ' tcx > MatchCheckCtxt < ' a , ' tcx > {
589
- pub ( super ) fn is_uninhabited ( & self , ty : Ty < ' tcx > ) -> bool {
590
- if self . tcx . features ( ) . exhaustive_patterns {
591
- self . tcx . is_ty_uninhabited_from ( self . module , ty, self . param_env )
592
- } else {
593
- false
594
- }
595
- }
596
-
597
- /// Returns whether the given type is an enum from another crate declared `#[non_exhaustive]`.
598
- pub ( super ) fn is_foreign_non_exhaustive_enum ( & self , ty : Ty < ' tcx > ) -> bool {
599
- match ty. kind ( ) {
600
- ty:: Adt ( def, ..) => {
601
- def. is_enum ( ) && def. is_variant_list_non_exhaustive ( ) && !def. did . is_local ( )
602
- }
603
- _ => false ,
604
- }
605
- }
606
- }
607
-
608
621
#[ derive( Clone , Debug ) ]
609
622
crate enum Usefulness < ' tcx > {
610
623
/// Carries, for each column in the matrix, a set of sub-branches that have been found to be
@@ -684,20 +697,6 @@ enum WitnessPreference {
684
697
LeaveOutWitness ,
685
698
}
686
699
687
- #[ derive( Copy , Clone ) ]
688
- pub ( super ) struct PatCtxt < ' a , ' p , ' tcx > {
689
- pub ( super ) cx : & ' a MatchCheckCtxt < ' p , ' tcx > ,
690
- /// Current state of the matrix.
691
- pub ( super ) matrix : & ' a Matrix < ' p , ' tcx > ,
692
- /// Type of the current column under investigation.
693
- pub ( super ) ty : Ty < ' tcx > ,
694
- /// Span of the current pattern under investigation.
695
- pub ( super ) span : Span ,
696
- /// Whether the current pattern is the whole pattern as found in a match arm, or if it's a
697
- /// subpattern.
698
- pub ( super ) is_top_level : bool ,
699
- }
700
-
701
700
/// A witness of non-exhaustiveness for error reporting, represented
702
701
/// as a list of patterns (in reverse order of construction) with
703
702
/// wildcards inside to represent elements that can take any inhabitant
0 commit comments