@@ -736,15 +736,13 @@ pub(crate) struct PlaceCtxt<'a, 'p, Cx: TypeCx> {
736
736
pub ( crate ) mcx : MatchCtxt < ' a , ' p , Cx > ,
737
737
/// Type of the place under investigation.
738
738
pub ( crate ) ty : Cx :: Ty ,
739
- /// Whether the place is the original scrutinee place, as opposed to a subplace of it.
740
- pub ( crate ) is_scrutinee : bool ,
741
739
}
742
740
743
741
impl < ' a , ' p , Cx : TypeCx > PlaceCtxt < ' a , ' p , Cx > {
744
742
/// A `PlaceCtxt` when code other than `is_useful` needs one.
745
743
#[ cfg_attr( not( feature = "rustc" ) , allow( dead_code) ) ]
746
744
pub ( crate ) fn new_dummy ( mcx : MatchCtxt < ' a , ' p , Cx > , ty : Cx :: Ty ) -> Self {
747
- PlaceCtxt { mcx, ty, is_scrutinee : false }
745
+ PlaceCtxt { mcx, ty }
748
746
}
749
747
750
748
pub ( crate ) fn ctor_arity ( & self , ctor : & Constructor < Cx > ) -> usize {
@@ -1355,7 +1353,7 @@ fn compute_exhaustiveness_and_usefulness<'a, 'p, Cx: TypeCx>(
1355
1353
} ;
1356
1354
1357
1355
debug ! ( "ty: {ty:?}" ) ;
1358
- let pcx = & PlaceCtxt { mcx, ty, is_scrutinee : is_top_level } ;
1356
+ let pcx = & PlaceCtxt { mcx, ty } ;
1359
1357
1360
1358
// Whether the place/column we are inspecting is known to contain valid data.
1361
1359
let place_validity = matrix. place_validity [ 0 ] ;
@@ -1364,7 +1362,17 @@ fn compute_exhaustiveness_and_usefulness<'a, 'p, Cx: TypeCx>(
1364
1362
let ctors = matrix. heads ( ) . map ( |p| p. ctor ( ) ) ;
1365
1363
let ctors_for_ty = pcx. ctors_for_ty ( ) ?;
1366
1364
let is_integers = matches ! ( ctors_for_ty, ConstructorSet :: Integers { .. } ) ; // For diagnostics.
1367
- let split_set = ctors_for_ty. split ( pcx, ctors) ;
1365
+ let mut split_set = ctors_for_ty. split ( ctors) ;
1366
+ // We have now grouped all the constructors into 3 buckets: present, missing, missing_empty.
1367
+ // In the absence of the `exhaustive_patterns` feature however, we don't count nested empty
1368
+ // types as empty. Only non-nested `!` or `enum Foo {}` are considered empty.
1369
+ if !pcx. mcx . tycx . is_exhaustive_patterns_feature_on ( )
1370
+ && !( is_top_level && matches ! ( ctors_for_ty, ConstructorSet :: NoConstructors ) )
1371
+ {
1372
+ // Treat all missing constructors as nonempty.
1373
+ // This clears `missing_empty`.
1374
+ split_set. missing . append ( & mut split_set. missing_empty ) ;
1375
+ }
1368
1376
let all_missing = split_set. present . is_empty ( ) ;
1369
1377
1370
1378
// Build the set of constructors we will specialize with. It must cover the whole type.
0 commit comments