@@ -168,6 +168,8 @@ impl<'tcx> MatchVisitor<'_, 'tcx> {
168
168
169
169
// Fifth, check if the match is exhaustive.
170
170
let scrut_ty = self . tables . node_type ( scrut. hir_id ) ;
171
+ // Note: An empty match isn't the same as an empty matrix for diagnostics purposes,
172
+ // since an empty matrix can occur when there are arms, if those arms all have guards.
171
173
let is_empty_match = inlined_arms. is_empty ( ) ;
172
174
check_exhaustive ( cx, scrut_ty, scrut. span , & matrix, scrut. hir_id , is_empty_match) ;
173
175
} )
@@ -435,27 +437,22 @@ fn check_exhaustive<'p, 'tcx>(
435
437
hir_id : HirId ,
436
438
is_empty_match : bool ,
437
439
) {
438
- // If the match has no arms, check whether the scrutinee is uninhabited.
439
- // Note: An empty match isn't the same as an empty matrix for diagnostics purposes, since an
440
- // empty matrix can occur when there are arms, if those arms all have guards.
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 {
440
+ // In the absence of the `exhaustive_patterns` feature, empty matches are not detected by
441
+ // `is_useful` to exhaustively match uninhabited types, so we manually check here.
442
+ if is_empty_match && !cx. tcx . features ( ) . exhaustive_patterns {
443
+ let scrutinee_is_visibly_uninhabited = match scrut_ty. kind {
446
444
ty:: Never => true ,
447
- ty:: Adt ( def, _) if def. is_enum ( ) => {
448
- def. variants . is_empty ( ) && !cx. is_foreign_non_exhaustive_enum ( scrut_ty)
445
+ ty:: Adt ( def, _) => {
446
+ def. is_enum ( )
447
+ && def. variants . is_empty ( )
448
+ && !cx. is_foreign_non_exhaustive_enum ( scrut_ty)
449
449
}
450
450
_ => false ,
451
+ } ;
452
+ if scrutinee_is_visibly_uninhabited {
453
+ // If the type *is* uninhabited, an empty match is vacuously exhaustive.
454
+ return ;
451
455
}
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 ;
459
456
}
460
457
461
458
let witnesses = match check_not_useful ( cx, scrut_ty, matrix, hir_id) {
0 commit comments