@@ -521,8 +521,12 @@ pub(crate) struct MatchCheckCtxt<'p, 'tcx> {
521521 pub ( crate ) module : DefId ,
522522 pub ( crate ) param_env : ty:: ParamEnv < ' tcx > ,
523523 pub ( crate ) pattern_arena : & ' p TypedArena < DeconstructedPat < ' p , ' tcx > > ,
524+ /// Lint level at the match.
525+ pub ( crate ) match_lint_level : HirId ,
524526 /// The span of the whole match, if applicable.
525527 pub ( crate ) match_span : Option < Span > ,
528+ /// Span of the scrutinee.
529+ pub ( crate ) scrut_span : Span ,
526530 /// Only produce `NON_EXHAUSTIVE_OMITTED_PATTERNS` lint on refutable patterns.
527531 pub ( crate ) refutable : bool ,
528532}
@@ -552,8 +556,6 @@ pub(super) struct PatCtxt<'a, 'p, 'tcx> {
552556 pub ( super ) cx : & ' a MatchCheckCtxt < ' p , ' tcx > ,
553557 /// Type of the current column under investigation.
554558 pub ( super ) ty : Ty < ' tcx > ,
555- /// Span of the current pattern under investigation.
556- pub ( super ) span : Span ,
557559 /// Whether the current pattern is the whole pattern as found in a match arm, or if it's a
558560 /// subpattern.
559561 pub ( super ) is_top_level : bool ,
@@ -1023,7 +1025,7 @@ fn compute_exhaustiveness_and_reachability<'p, 'tcx>(
10231025 } ;
10241026
10251027 debug ! ( "ty: {ty:?}" ) ;
1026- let pcx = & PatCtxt { cx, ty, span : DUMMY_SP , is_top_level } ;
1028+ let pcx = & PatCtxt { cx, ty, is_top_level } ;
10271029
10281030 // Analyze the constructors present in this column.
10291031 let ctors = matrix. heads ( ) . map ( |p| p. ctor ( ) ) ;
@@ -1167,7 +1169,7 @@ fn collect_nonexhaustive_missing_variants<'p, 'tcx>(
11671169 let Some ( ty) = column. head_ty ( ) else {
11681170 return Vec :: new ( ) ;
11691171 } ;
1170- let pcx = & PatCtxt { cx, ty, span : DUMMY_SP , is_top_level : false } ;
1172+ let pcx = & PatCtxt { cx, ty, is_top_level : false } ;
11711173
11721174 let set = column. analyze_ctors ( pcx) ;
11731175 if set. present . is_empty ( ) {
@@ -1208,16 +1210,15 @@ fn collect_nonexhaustive_missing_variants<'p, 'tcx>(
12081210}
12091211
12101212/// Traverse the patterns to warn the user about ranges that overlap on their endpoints.
1211- #[ instrument( level = "debug" , skip( cx, lint_root ) ) ]
1213+ #[ instrument( level = "debug" , skip( cx) ) ]
12121214fn lint_overlapping_range_endpoints < ' p , ' tcx > (
12131215 cx : & MatchCheckCtxt < ' p , ' tcx > ,
12141216 column : & PatternColumn < ' p , ' tcx > ,
1215- lint_root : HirId ,
12161217) {
12171218 let Some ( ty) = column. head_ty ( ) else {
12181219 return ;
12191220 } ;
1220- let pcx = & PatCtxt { cx, ty, span : DUMMY_SP , is_top_level : false } ;
1221+ let pcx = & PatCtxt { cx, ty, is_top_level : false } ;
12211222
12221223 let set = column. analyze_ctors ( pcx) ;
12231224
@@ -1231,7 +1232,7 @@ fn lint_overlapping_range_endpoints<'p, 'tcx>(
12311232 . collect ( ) ;
12321233 cx. tcx . emit_spanned_lint (
12331234 lint:: builtin:: OVERLAPPING_RANGE_ENDPOINTS ,
1234- lint_root ,
1235+ cx . match_lint_level ,
12351236 this_span,
12361237 OverlappingRangeEndpoints { overlap : overlaps, range : this_span } ,
12371238 ) ;
@@ -1276,7 +1277,7 @@ fn lint_overlapping_range_endpoints<'p, 'tcx>(
12761277 // Recurse into the fields.
12771278 for ctor in set. present {
12781279 for col in column. specialize ( pcx, & ctor) {
1279- lint_overlapping_range_endpoints ( cx, & col, lint_root ) ;
1280+ lint_overlapping_range_endpoints ( cx, & col) ;
12801281 }
12811282 }
12821283 }
@@ -1317,9 +1318,7 @@ pub(crate) struct UsefulnessReport<'p, 'tcx> {
13171318pub ( crate ) fn compute_match_usefulness < ' p , ' tcx > (
13181319 cx : & MatchCheckCtxt < ' p , ' tcx > ,
13191320 arms : & [ MatchArm < ' p , ' tcx > ] ,
1320- lint_root : HirId ,
13211321 scrut_ty : Ty < ' tcx > ,
1322- scrut_span : Span ,
13231322) -> UsefulnessReport < ' p , ' tcx > {
13241323 let mut matrix = Matrix :: new ( cx, arms. iter ( ) , scrut_ty) ;
13251324 let non_exhaustiveness_witnesses =
@@ -1343,13 +1342,13 @@ pub(crate) fn compute_match_usefulness<'p, 'tcx>(
13431342
13441343 let pat_column = PatternColumn :: new ( matrix. heads ( ) . collect ( ) ) ;
13451344 // Lint on ranges that overlap on their endpoints, which is likely a mistake.
1346- lint_overlapping_range_endpoints ( cx, & pat_column, lint_root ) ;
1345+ lint_overlapping_range_endpoints ( cx, & pat_column) ;
13471346
13481347 // Run the non_exhaustive_omitted_patterns lint. Only run on refutable patterns to avoid hitting
13491348 // `if let`s. Only run if the match is exhaustive otherwise the error is redundant.
13501349 if cx. refutable && report. non_exhaustiveness_witnesses . is_empty ( ) {
13511350 if !matches ! (
1352- cx. tcx. lint_level_at_node( NON_EXHAUSTIVE_OMITTED_PATTERNS , lint_root ) . 0 ,
1351+ cx. tcx. lint_level_at_node( NON_EXHAUSTIVE_OMITTED_PATTERNS , cx . match_lint_level ) . 0 ,
13531352 rustc_session:: lint:: Level :: Allow
13541353 ) {
13551354 let witnesses = collect_nonexhaustive_missing_variants ( cx, & pat_column) ;
@@ -1360,11 +1359,11 @@ pub(crate) fn compute_match_usefulness<'p, 'tcx>(
13601359 // NB: The partner lint for structs lives in `compiler/rustc_hir_analysis/src/check/pat.rs`.
13611360 cx. tcx . emit_spanned_lint (
13621361 NON_EXHAUSTIVE_OMITTED_PATTERNS ,
1363- lint_root ,
1364- scrut_span,
1362+ cx . match_lint_level ,
1363+ cx . scrut_span ,
13651364 NonExhaustiveOmittedPattern {
13661365 scrut_ty,
1367- uncovered : Uncovered :: new ( scrut_span, cx, witnesses) ,
1366+ uncovered : Uncovered :: new ( cx . scrut_span , cx, witnesses) ,
13681367 } ,
13691368 ) ;
13701369 }
0 commit comments