@@ -939,43 +939,30 @@ fn report_non_exhaustive_match<'p, 'tcx>(
939
939
} ;
940
940
// In the case of an empty match, replace the '`_` not covered' diagnostic with something more
941
941
// informative.
942
- let mut err;
943
- let pattern;
944
- let patterns_len;
945
942
if is_empty_match && !non_empty_enum {
946
943
return cx. tcx . dcx ( ) . emit_err ( NonExhaustivePatternsTypeNotEmpty {
947
944
cx,
948
945
expr_span,
949
946
span : sp,
950
947
ty : scrut_ty,
951
948
} ) ;
952
- } else {
953
- // FIXME: migration of this diagnostic will require list support
954
- let joined_patterns = joined_uncovered_patterns ( cx, & witnesses) ;
955
- err = create_e0004 (
956
- cx. tcx . sess ,
957
- sp,
958
- format ! ( "non-exhaustive patterns: {joined_patterns} not covered" ) ,
959
- ) ;
960
- err. span_label (
961
- sp,
962
- format ! (
963
- "pattern{} {} not covered" ,
964
- rustc_errors:: pluralize!( witnesses. len( ) ) ,
965
- joined_patterns
966
- ) ,
967
- ) ;
968
- patterns_len = witnesses. len ( ) ;
969
- pattern = if witnesses. len ( ) < 4 {
970
- witnesses
971
- . iter ( )
972
- . map ( |witness| cx. hoist_witness_pat ( witness) . to_string ( ) )
973
- . collect :: < Vec < String > > ( )
974
- . join ( " | " )
975
- } else {
976
- "_" . to_string ( )
977
- } ;
978
- } ;
949
+ }
950
+
951
+ // FIXME: migration of this diagnostic will require list support
952
+ let joined_patterns = joined_uncovered_patterns ( cx, & witnesses) ;
953
+ let mut err = create_e0004 (
954
+ cx. tcx . sess ,
955
+ sp,
956
+ format ! ( "non-exhaustive patterns: {joined_patterns} not covered" ) ,
957
+ ) ;
958
+ err. span_label (
959
+ sp,
960
+ format ! (
961
+ "pattern{} {} not covered" ,
962
+ rustc_errors:: pluralize!( witnesses. len( ) ) ,
963
+ joined_patterns
964
+ ) ,
965
+ ) ;
979
966
980
967
// Point at the definition of non-covered `enum` variants.
981
968
if let Some ( AdtDefinedHere { adt_def_span, ty, variants } ) =
@@ -1022,16 +1009,25 @@ fn report_non_exhaustive_match<'p, 'tcx>(
1022
1009
}
1023
1010
}
1024
1011
1025
- let mut suggestion = None ;
1026
- let sm = cx. tcx . sess . source_map ( ) ;
1027
- let suggested_arm = if witnesses. len ( ) < 4
1028
- && witnesses. iter ( ) . all ( |p| p. is_never_pattern ( ) )
1029
- && cx. tcx . features ( ) . never_patterns
1030
- {
1031
- pattern
1012
+ // Whether we suggest the actual missing patterns or `_`.
1013
+ let suggest_the_witnesses = witnesses. len ( ) < 4 ;
1014
+ let suggested_arm = if suggest_the_witnesses {
1015
+ let pattern = witnesses
1016
+ . iter ( )
1017
+ . map ( |witness| cx. hoist_witness_pat ( witness) . to_string ( ) )
1018
+ . collect :: < Vec < String > > ( )
1019
+ . join ( " | " ) ;
1020
+ if witnesses. iter ( ) . all ( |p| p. is_never_pattern ( ) ) && cx. tcx . features ( ) . never_patterns {
1021
+ // Arms with a never pattern don't take a body.
1022
+ pattern
1023
+ } else {
1024
+ format ! ( "{pattern} => todo!()" )
1025
+ }
1032
1026
} else {
1033
- format ! ( "{pattern} => todo!()" )
1027
+ format ! ( "_ => todo!()" )
1034
1028
} ;
1029
+ let mut suggestion = None ;
1030
+ let sm = cx. tcx . sess . source_map ( ) ;
1035
1031
match arms {
1036
1032
[ ] if sp. eq_ctxt ( expr_span) => {
1037
1033
// Get the span for the empty match body `{}`.
@@ -1102,13 +1098,13 @@ fn report_non_exhaustive_match<'p, 'tcx>(
1102
1098
let msg = format ! (
1103
1099
"ensure that all possible cases are being handled by adding a match arm with a wildcard \
1104
1100
pattern{}{}",
1105
- if patterns_len > 1 && patterns_len < 4 && suggestion. is_some( ) {
1101
+ if witnesses . len ( ) > 1 && suggest_the_witnesses && suggestion. is_some( ) {
1106
1102
", a match arm with multiple or-patterns"
1107
1103
} else {
1108
1104
// we are either not suggesting anything, or suggesting `_`
1109
1105
""
1110
1106
} ,
1111
- match patterns_len {
1107
+ match witnesses . len ( ) {
1112
1108
// non-exhaustive enum case
1113
1109
0 if suggestion. is_some( ) => " as shown" ,
1114
1110
0 => "" ,
0 commit comments