@@ -438,56 +438,52 @@ fn check_exhaustive<'p, 'tcx>(
438
438
// If the match has no arms, check whether the scrutinee is uninhabited.
439
439
// Note: An empty match isn't the same as an empty matrix for diagnostics purposes, since an
440
440
// empty matrix can occur when there are arms, if those arms all have guards.
441
- if is_empty_match {
442
- let scrutinee_is_visibly_uninhabited = if cx. tcx . features ( ) . exhaustive_patterns {
443
- let module = cx. tcx . hir ( ) . get_module_parent ( hir_id) ;
444
- cx. tcx . is_ty_uninhabited_from ( module, scrut_ty)
445
- } else {
446
- match scrut_ty. kind {
447
- ty:: Never => true ,
448
- ty:: Adt ( def, _) if def. is_enum ( ) => {
449
- def. variants . is_empty ( ) && !cx. is_foreign_non_exhaustive_enum ( scrut_ty)
450
- }
451
- _ => false ,
452
- }
453
- } ;
454
- if scrutinee_is_visibly_uninhabited {
455
- // If the type *is* uninhabited, it's vacuously exhaustive.
456
- // This early return is only needed here because in the absence of the
457
- // `exhaustive_patterns` feature, empty matches are not detected by `is_useful`
458
- // to exhaustively match uninhabited types.
459
- return ;
460
- } else {
461
- // We know the type is inhabited, so this must be wrong
462
- let non_empty_enum = match scrut_ty. kind {
463
- ty:: Adt ( def, _) => def. is_enum ( ) && !def. variants . is_empty ( ) ,
464
- _ => false ,
465
- } ;
466
-
467
- if non_empty_enum {
468
- // Continue to the normal code path to display missing variants.
469
- } else {
470
- let mut err = create_e0004 (
471
- cx. tcx . sess ,
472
- sp,
473
- format ! ( "non-exhaustive patterns: type `{}` is non-empty" , scrut_ty) ,
474
- ) ;
475
- err. help (
476
- "ensure that all possible cases are being handled, \
477
- possibly by adding wildcards or more match arms",
478
- ) ;
479
- adt_defined_here ( cx, & mut err, scrut_ty, & [ ] ) ;
480
- err. emit ( ) ;
481
- return ;
441
+ let scrutinee_is_visibly_uninhabited = if cx. tcx . features ( ) . exhaustive_patterns {
442
+ let module = cx. tcx . hir ( ) . get_module_parent ( hir_id) ;
443
+ cx. tcx . is_ty_uninhabited_from ( module, scrut_ty)
444
+ } else {
445
+ match scrut_ty. kind {
446
+ ty:: Never => true ,
447
+ ty:: Adt ( def, _) if def. is_enum ( ) => {
448
+ def. variants . is_empty ( ) && !cx. is_foreign_non_exhaustive_enum ( scrut_ty)
482
449
}
450
+ _ => false ,
483
451
}
452
+ } ;
453
+ if is_empty_match && scrutinee_is_visibly_uninhabited {
454
+ // If the type *is* uninhabited, it's vacuously exhaustive.
455
+ // This early return is only needed here because in the absence of the
456
+ // `exhaustive_patterns` feature, empty matches are not detected by `is_useful`
457
+ // to exhaustively match uninhabited types.
458
+ return ;
484
459
}
485
460
486
461
let witnesses = match check_not_useful ( cx, scrut_ty, matrix, hir_id) {
487
462
Ok ( _) => return ,
488
463
Err ( err) => err,
489
464
} ;
490
465
466
+ let non_empty_enum = match scrut_ty. kind {
467
+ ty:: Adt ( def, _) => def. is_enum ( ) && !def. variants . is_empty ( ) ,
468
+ _ => false ,
469
+ } ;
470
+ // In the case of an empty match, replace the '`_` not covered' diagnostic with something more
471
+ // informative.
472
+ if is_empty_match && !non_empty_enum {
473
+ let mut err = create_e0004 (
474
+ cx. tcx . sess ,
475
+ sp,
476
+ format ! ( "non-exhaustive patterns: type `{}` is non-empty" , scrut_ty) ,
477
+ ) ;
478
+ err. help (
479
+ "ensure that all possible cases are being handled, \
480
+ possibly by adding wildcards or more match arms",
481
+ ) ;
482
+ adt_defined_here ( cx, & mut err, scrut_ty, & [ ] ) ;
483
+ err. emit ( ) ;
484
+ return ;
485
+ }
486
+
491
487
let joined_patterns = joined_uncovered_patterns ( & witnesses) ;
492
488
let mut err = create_e0004 (
493
489
cx. tcx . sess ,
0 commit comments