Skip to content

Commit 0edb879

Browse files
committed
Cleanup span passing
1 parent fd0d883 commit 0edb879

File tree

3 files changed

+31
-30
lines changed

3 files changed

+31
-30
lines changed

compiler/rustc_mir_build/src/thir/pattern/check_match.rs

+8-5
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@ impl<'thir, 'p, 'tcx> MatchVisitor<'thir, 'p, 'tcx> {
291291
&self,
292292
refutability: RefutableFlag,
293293
match_span: Option<Span>,
294+
scrut_span: Span,
294295
) -> MatchCheckCtxt<'p, 'tcx> {
295296
let refutable = match refutability {
296297
Irrefutable => false,
@@ -301,7 +302,9 @@ impl<'thir, 'p, 'tcx> MatchVisitor<'thir, 'p, 'tcx> {
301302
param_env: self.param_env,
302303
module: self.tcx.parent_module(self.lint_level).to_def_id(),
303304
pattern_arena: self.pattern_arena,
305+
match_lint_level: self.lint_level,
304306
match_span,
307+
scrut_span,
305308
refutable,
306309
}
307310
}
@@ -332,7 +335,8 @@ impl<'thir, 'p, 'tcx> MatchVisitor<'thir, 'p, 'tcx> {
332335
source: hir::MatchSource,
333336
expr_span: Span,
334337
) {
335-
let cx = self.new_cx(Refutable, Some(expr_span));
338+
let scrut = &self.thir[scrut];
339+
let cx = self.new_cx(Refutable, Some(expr_span), scrut.span);
336340

337341
let mut tarms = Vec::with_capacity(arms.len());
338342
for &arm in arms {
@@ -348,9 +352,8 @@ impl<'thir, 'p, 'tcx> MatchVisitor<'thir, 'p, 'tcx> {
348352
}
349353
}
350354

351-
let scrut = &self.thir[scrut];
352355
let scrut_ty = scrut.ty;
353-
let report = compute_match_usefulness(&cx, &tarms, self.lint_level, scrut_ty, scrut.span);
356+
let report = compute_match_usefulness(&cx, &tarms, scrut_ty);
354357

355358
match source {
356359
// Don't report arm reachability of desugared `match $iter.into_iter() { iter => .. }`
@@ -455,10 +458,10 @@ impl<'thir, 'p, 'tcx> MatchVisitor<'thir, 'p, 'tcx> {
455458
pat: &Pat<'tcx>,
456459
refutability: RefutableFlag,
457460
) -> Result<(MatchCheckCtxt<'p, 'tcx>, UsefulnessReport<'p, 'tcx>), ErrorGuaranteed> {
458-
let cx = self.new_cx(refutability, None);
461+
let cx = self.new_cx(refutability, None, pat.span);
459462
let pat = self.lower_pattern(&cx, pat)?;
460463
let arms = [MatchArm { pat, hir_id: self.lint_level, has_guard: false }];
461-
let report = compute_match_usefulness(&cx, &arms, self.lint_level, pat.ty(), pat.span());
464+
let report = compute_match_usefulness(&cx, &arms, pat.ty());
462465
Ok((cx, report))
463466
}
464467

compiler/rustc_mir_build/src/thir/pattern/deconstruct_pat.rs

+8-9
Original file line numberDiff line numberDiff line change
@@ -848,7 +848,7 @@ impl<'tcx> Constructor<'tcx> {
848848
(Opaque(..), _) | (_, Opaque(..)) => false,
849849

850850
_ => span_bug!(
851-
pcx.span,
851+
pcx.cx.scrut_span,
852852
"trying to compare incompatible constructors {:?} and {:?}",
853853
self,
854854
other
@@ -1249,9 +1249,8 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
12491249
fn wildcards_from_tys(
12501250
cx: &MatchCheckCtxt<'p, 'tcx>,
12511251
tys: impl IntoIterator<Item = Ty<'tcx>>,
1252-
span: Span,
12531252
) -> Self {
1254-
Fields::from_iter(cx, tys.into_iter().map(|ty| DeconstructedPat::wildcard(ty, span)))
1253+
Fields::from_iter(cx, tys.into_iter().map(|ty| DeconstructedPat::wildcard(ty, DUMMY_SP)))
12551254
}
12561255

12571256
// In the cases of either a `#[non_exhaustive]` field list or a non-public field, we hide
@@ -1287,26 +1286,26 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
12871286
pub(super) fn wildcards(pcx: &PatCtxt<'_, 'p, 'tcx>, constructor: &Constructor<'tcx>) -> Self {
12881287
let ret = match constructor {
12891288
Single | Variant(_) => match pcx.ty.kind() {
1290-
ty::Tuple(fs) => Fields::wildcards_from_tys(pcx.cx, fs.iter(), pcx.span),
1291-
ty::Ref(_, rty, _) => Fields::wildcards_from_tys(pcx.cx, once(*rty), pcx.span),
1289+
ty::Tuple(fs) => Fields::wildcards_from_tys(pcx.cx, fs.iter()),
1290+
ty::Ref(_, rty, _) => Fields::wildcards_from_tys(pcx.cx, once(*rty)),
12921291
ty::Adt(adt, args) => {
12931292
if adt.is_box() {
12941293
// The only legal patterns of type `Box` (outside `std`) are `_` and box
12951294
// patterns. If we're here we can assume this is a box pattern.
1296-
Fields::wildcards_from_tys(pcx.cx, once(args.type_at(0)), pcx.span)
1295+
Fields::wildcards_from_tys(pcx.cx, once(args.type_at(0)))
12971296
} else {
12981297
let variant = &adt.variant(constructor.variant_index_for_adt(*adt));
12991298
let tys = Fields::list_variant_nonhidden_fields(pcx.cx, pcx.ty, variant)
13001299
.map(|(_, ty)| ty);
1301-
Fields::wildcards_from_tys(pcx.cx, tys, pcx.span)
1300+
Fields::wildcards_from_tys(pcx.cx, tys)
13021301
}
13031302
}
13041303
_ => bug!("Unexpected type for `Single` constructor: {:?}", pcx),
13051304
},
13061305
Slice(slice) => match *pcx.ty.kind() {
13071306
ty::Slice(ty) | ty::Array(ty, _) => {
13081307
let arity = slice.arity();
1309-
Fields::wildcards_from_tys(pcx.cx, (0..arity).map(|_| ty), pcx.span)
1308+
Fields::wildcards_from_tys(pcx.cx, (0..arity).map(|_| ty))
13101309
}
13111310
_ => bug!("bad slice pattern {:?} {:?}", constructor, pcx),
13121311
},
@@ -1625,7 +1624,7 @@ impl<'p, 'tcx> DeconstructedPat<'p, 'tcx> {
16251624
let wildcard: &_ = pcx
16261625
.cx
16271626
.pattern_arena
1628-
.alloc(DeconstructedPat::wildcard(inner_ty, pcx.span));
1627+
.alloc(DeconstructedPat::wildcard(inner_ty, DUMMY_SP));
16291628
let extra_wildcards = other_slice.arity() - self_slice.arity();
16301629
let extra_wildcards = (0..extra_wildcards).map(|_| wildcard);
16311630
prefix.iter().chain(extra_wildcards).chain(suffix).collect()

compiler/rustc_mir_build/src/thir/pattern/usefulness.rs

+15-16
Original file line numberDiff line numberDiff line change
@@ -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,
@@ -1020,7 +1022,7 @@ fn compute_exhaustiveness_and_reachability<'p, 'tcx>(
10201022
};
10211023

10221024
debug!("ty: {ty:?}");
1023-
let pcx = &PatCtxt { cx, ty, span: DUMMY_SP, is_top_level };
1025+
let pcx = &PatCtxt { cx, ty, is_top_level };
10241026

10251027
// Analyze the constructors present in this column.
10261028
let ctors = matrix.heads().map(|p| p.ctor());
@@ -1169,7 +1171,7 @@ fn collect_nonexhaustive_missing_variants<'p, 'tcx>(
11691171
let Some(ty) = column.head_ty() else {
11701172
return Vec::new();
11711173
};
1172-
let pcx = &PatCtxt { cx, ty, span: DUMMY_SP, is_top_level: false };
1174+
let pcx = &PatCtxt { cx, ty, is_top_level: false };
11731175

11741176
let set = column.analyze_ctors(pcx);
11751177
if set.present.is_empty() {
@@ -1210,16 +1212,15 @@ fn collect_nonexhaustive_missing_variants<'p, 'tcx>(
12101212
}
12111213

12121214
/// Traverse the patterns to warn the user about ranges that overlap on their endpoints.
1213-
#[instrument(level = "debug", skip(cx, lint_root))]
1215+
#[instrument(level = "debug", skip(cx))]
12141216
fn lint_overlapping_range_endpoints<'p, 'tcx>(
12151217
cx: &MatchCheckCtxt<'p, 'tcx>,
12161218
column: &PatternColumn<'p, 'tcx>,
1217-
lint_root: HirId,
12181219
) {
12191220
let Some(ty) = column.head_ty() else {
12201221
return;
12211222
};
1222-
let pcx = &PatCtxt { cx, ty, span: DUMMY_SP, is_top_level: false };
1223+
let pcx = &PatCtxt { cx, ty, is_top_level: false };
12231224

12241225
let set = column.analyze_ctors(pcx);
12251226

@@ -1233,7 +1234,7 @@ fn lint_overlapping_range_endpoints<'p, 'tcx>(
12331234
.collect();
12341235
cx.tcx.emit_spanned_lint(
12351236
lint::builtin::OVERLAPPING_RANGE_ENDPOINTS,
1236-
lint_root,
1237+
cx.match_lint_level,
12371238
this_span,
12381239
OverlappingRangeEndpoints { overlap: overlaps, range: this_span },
12391240
);
@@ -1278,7 +1279,7 @@ fn lint_overlapping_range_endpoints<'p, 'tcx>(
12781279
// Recurse into the fields.
12791280
for ctor in set.present {
12801281
for col in column.specialize(pcx, &ctor) {
1281-
lint_overlapping_range_endpoints(cx, &col, lint_root);
1282+
lint_overlapping_range_endpoints(cx, &col);
12821283
}
12831284
}
12841285
}
@@ -1319,9 +1320,7 @@ pub(crate) struct UsefulnessReport<'p, 'tcx> {
13191320
pub(crate) fn compute_match_usefulness<'p, 'tcx>(
13201321
cx: &MatchCheckCtxt<'p, 'tcx>,
13211322
arms: &[MatchArm<'p, 'tcx>],
1322-
lint_root: HirId,
13231323
scrut_ty: Ty<'tcx>,
1324-
scrut_span: Span,
13251324
) -> UsefulnessReport<'p, 'tcx> {
13261325
let mut matrix = Matrix::new(cx, arms.iter(), scrut_ty);
13271326
let non_exhaustiveness_witnesses =
@@ -1345,13 +1344,13 @@ pub(crate) fn compute_match_usefulness<'p, 'tcx>(
13451344

13461345
let pat_column = PatternColumn::new(matrix.heads().collect());
13471346
// Lint on ranges that overlap on their endpoints, which is likely a mistake.
1348-
lint_overlapping_range_endpoints(cx, &pat_column, lint_root);
1347+
lint_overlapping_range_endpoints(cx, &pat_column);
13491348

13501349
// Run the non_exhaustive_omitted_patterns lint. Only run on refutable patterns to avoid hitting
13511350
// `if let`s. Only run if the match is exhaustive otherwise the error is redundant.
13521351
if cx.refutable && report.non_exhaustiveness_witnesses.is_empty() {
13531352
if !matches!(
1354-
cx.tcx.lint_level_at_node(NON_EXHAUSTIVE_OMITTED_PATTERNS, lint_root).0,
1353+
cx.tcx.lint_level_at_node(NON_EXHAUSTIVE_OMITTED_PATTERNS, cx.match_lint_level).0,
13551354
rustc_session::lint::Level::Allow
13561355
) {
13571356
let witnesses = collect_nonexhaustive_missing_variants(cx, &pat_column);
@@ -1362,11 +1361,11 @@ pub(crate) fn compute_match_usefulness<'p, 'tcx>(
13621361
// NB: The partner lint for structs lives in `compiler/rustc_hir_analysis/src/check/pat.rs`.
13631362
cx.tcx.emit_spanned_lint(
13641363
NON_EXHAUSTIVE_OMITTED_PATTERNS,
1365-
lint_root,
1366-
scrut_span,
1364+
cx.match_lint_level,
1365+
cx.scrut_span,
13671366
NonExhaustiveOmittedPattern {
13681367
scrut_ty,
1369-
uncovered: Uncovered::new(scrut_span, cx, witnesses),
1368+
uncovered: Uncovered::new(cx.scrut_span, cx, witnesses),
13701369
},
13711370
);
13721371
}

0 commit comments

Comments
 (0)