@@ -521,8 +521,12 @@ pub(crate) struct MatchCheckCtxt<'p, 'tcx> {
521
521
pub ( crate ) module : DefId ,
522
522
pub ( crate ) param_env : ty:: ParamEnv < ' tcx > ,
523
523
pub ( crate ) pattern_arena : & ' p TypedArena < DeconstructedPat < ' p , ' tcx > > ,
524
+ /// Lint level at the match.
525
+ pub ( crate ) match_lint_level : HirId ,
524
526
/// The span of the whole match, if applicable.
525
527
pub ( crate ) match_span : Option < Span > ,
528
+ /// Span of the scrutinee.
529
+ pub ( crate ) scrut_span : Span ,
526
530
/// Only produce `NON_EXHAUSTIVE_OMITTED_PATTERNS` lint on refutable patterns.
527
531
pub ( crate ) refutable : bool ,
528
532
}
@@ -552,8 +556,6 @@ pub(super) struct PatCtxt<'a, 'p, 'tcx> {
552
556
pub ( super ) cx : & ' a MatchCheckCtxt < ' p , ' tcx > ,
553
557
/// Type of the current column under investigation.
554
558
pub ( super ) ty : Ty < ' tcx > ,
555
- /// Span of the current pattern under investigation.
556
- pub ( super ) span : Span ,
557
559
/// Whether the current pattern is the whole pattern as found in a match arm, or if it's a
558
560
/// subpattern.
559
561
pub ( super ) is_top_level : bool ,
@@ -1022,7 +1024,7 @@ fn compute_exhaustiveness_and_reachability<'p, 'tcx>(
1022
1024
} ;
1023
1025
1024
1026
debug ! ( "ty: {ty:?}" ) ;
1025
- let pcx = & PatCtxt { cx, ty, span : DUMMY_SP , is_top_level } ;
1027
+ let pcx = & PatCtxt { cx, ty, is_top_level } ;
1026
1028
1027
1029
// Analyze the constructors present in this column.
1028
1030
let ctors = matrix. heads ( ) . map ( |p| p. ctor ( ) ) ;
@@ -1166,7 +1168,7 @@ fn collect_nonexhaustive_missing_variants<'p, 'tcx>(
1166
1168
let Some ( ty) = column. head_ty ( ) else {
1167
1169
return Vec :: new ( ) ;
1168
1170
} ;
1169
- let pcx = & PatCtxt { cx, ty, span : DUMMY_SP , is_top_level : false } ;
1171
+ let pcx = & PatCtxt { cx, ty, is_top_level : false } ;
1170
1172
1171
1173
let set = column. analyze_ctors ( pcx) ;
1172
1174
if set. present . is_empty ( ) {
@@ -1207,16 +1209,15 @@ fn collect_nonexhaustive_missing_variants<'p, 'tcx>(
1207
1209
}
1208
1210
1209
1211
/// Traverse the patterns to warn the user about ranges that overlap on their endpoints.
1210
- #[ instrument( level = "debug" , skip( cx, lint_root ) ) ]
1212
+ #[ instrument( level = "debug" , skip( cx) ) ]
1211
1213
fn lint_overlapping_range_endpoints < ' p , ' tcx > (
1212
1214
cx : & MatchCheckCtxt < ' p , ' tcx > ,
1213
1215
column : & PatternColumn < ' p , ' tcx > ,
1214
- lint_root : HirId ,
1215
1216
) {
1216
1217
let Some ( ty) = column. head_ty ( ) else {
1217
1218
return ;
1218
1219
} ;
1219
- let pcx = & PatCtxt { cx, ty, span : DUMMY_SP , is_top_level : false } ;
1220
+ let pcx = & PatCtxt { cx, ty, is_top_level : false } ;
1220
1221
1221
1222
let set = column. analyze_ctors ( pcx) ;
1222
1223
@@ -1230,7 +1231,7 @@ fn lint_overlapping_range_endpoints<'p, 'tcx>(
1230
1231
. collect ( ) ;
1231
1232
cx. tcx . emit_spanned_lint (
1232
1233
lint:: builtin:: OVERLAPPING_RANGE_ENDPOINTS ,
1233
- lint_root ,
1234
+ cx . match_lint_level ,
1234
1235
this_span,
1235
1236
OverlappingRangeEndpoints { overlap : overlaps, range : this_span } ,
1236
1237
) ;
@@ -1275,7 +1276,7 @@ fn lint_overlapping_range_endpoints<'p, 'tcx>(
1275
1276
// Recurse into the fields.
1276
1277
for ctor in set. present {
1277
1278
for col in column. specialize ( pcx, & ctor) {
1278
- lint_overlapping_range_endpoints ( cx, & col, lint_root ) ;
1279
+ lint_overlapping_range_endpoints ( cx, & col) ;
1279
1280
}
1280
1281
}
1281
1282
}
@@ -1316,9 +1317,7 @@ pub(crate) struct UsefulnessReport<'p, 'tcx> {
1316
1317
pub ( crate ) fn compute_match_usefulness < ' p , ' tcx > (
1317
1318
cx : & MatchCheckCtxt < ' p , ' tcx > ,
1318
1319
arms : & [ MatchArm < ' p , ' tcx > ] ,
1319
- lint_root : HirId ,
1320
1320
scrut_ty : Ty < ' tcx > ,
1321
- scrut_span : Span ,
1322
1321
) -> UsefulnessReport < ' p , ' tcx > {
1323
1322
let mut matrix = Matrix :: new ( cx, arms. iter ( ) , scrut_ty) ;
1324
1323
let non_exhaustiveness_witnesses =
@@ -1342,13 +1341,13 @@ pub(crate) fn compute_match_usefulness<'p, 'tcx>(
1342
1341
1343
1342
let pat_column = PatternColumn :: new ( matrix. heads ( ) . collect ( ) ) ;
1344
1343
// Lint on ranges that overlap on their endpoints, which is likely a mistake.
1345
- lint_overlapping_range_endpoints ( cx, & pat_column, lint_root ) ;
1344
+ lint_overlapping_range_endpoints ( cx, & pat_column) ;
1346
1345
1347
1346
// Run the non_exhaustive_omitted_patterns lint. Only run on refutable patterns to avoid hitting
1348
1347
// `if let`s. Only run if the match is exhaustive otherwise the error is redundant.
1349
1348
if cx. refutable && report. non_exhaustiveness_witnesses . is_empty ( ) {
1350
1349
if !matches ! (
1351
- cx. tcx. lint_level_at_node( NON_EXHAUSTIVE_OMITTED_PATTERNS , lint_root ) . 0 ,
1350
+ cx. tcx. lint_level_at_node( NON_EXHAUSTIVE_OMITTED_PATTERNS , cx . match_lint_level ) . 0 ,
1352
1351
rustc_session:: lint:: Level :: Allow
1353
1352
) {
1354
1353
let witnesses = collect_nonexhaustive_missing_variants ( cx, & pat_column) ;
@@ -1359,11 +1358,11 @@ pub(crate) fn compute_match_usefulness<'p, 'tcx>(
1359
1358
// NB: The partner lint for structs lives in `compiler/rustc_hir_analysis/src/check/pat.rs`.
1360
1359
cx. tcx . emit_spanned_lint (
1361
1360
NON_EXHAUSTIVE_OMITTED_PATTERNS ,
1362
- lint_root ,
1363
- scrut_span,
1361
+ cx . match_lint_level ,
1362
+ cx . scrut_span ,
1364
1363
NonExhaustiveOmittedPattern {
1365
1364
scrut_ty,
1366
- uncovered : Uncovered :: new ( scrut_span, cx, witnesses) ,
1365
+ uncovered : Uncovered :: new ( cx . scrut_span , cx, witnesses) ,
1367
1366
} ,
1368
1367
) ;
1369
1368
}
0 commit comments