Cleanup span passing
This commit is contained in:
parent
fd0d8834c2
commit
0edb879167
@ -291,6 +291,7 @@ fn new_cx(
|
||||
&self,
|
||||
refutability: RefutableFlag,
|
||||
match_span: Option<Span>,
|
||||
scrut_span: Span,
|
||||
) -> MatchCheckCtxt<'p, 'tcx> {
|
||||
let refutable = match refutability {
|
||||
Irrefutable => false,
|
||||
@ -301,7 +302,9 @@ fn new_cx(
|
||||
param_env: self.param_env,
|
||||
module: self.tcx.parent_module(self.lint_level).to_def_id(),
|
||||
pattern_arena: self.pattern_arena,
|
||||
match_lint_level: self.lint_level,
|
||||
match_span,
|
||||
scrut_span,
|
||||
refutable,
|
||||
}
|
||||
}
|
||||
@ -332,7 +335,8 @@ fn check_match(
|
||||
source: hir::MatchSource,
|
||||
expr_span: Span,
|
||||
) {
|
||||
let cx = self.new_cx(Refutable, Some(expr_span));
|
||||
let scrut = &self.thir[scrut];
|
||||
let cx = self.new_cx(Refutable, Some(expr_span), scrut.span);
|
||||
|
||||
let mut tarms = Vec::with_capacity(arms.len());
|
||||
for &arm in arms {
|
||||
@ -348,9 +352,8 @@ fn check_match(
|
||||
}
|
||||
}
|
||||
|
||||
let scrut = &self.thir[scrut];
|
||||
let scrut_ty = scrut.ty;
|
||||
let report = compute_match_usefulness(&cx, &tarms, self.lint_level, scrut_ty, scrut.span);
|
||||
let report = compute_match_usefulness(&cx, &tarms, scrut_ty);
|
||||
|
||||
match source {
|
||||
// Don't report arm reachability of desugared `match $iter.into_iter() { iter => .. }`
|
||||
@ -455,10 +458,10 @@ fn analyze_binding(
|
||||
pat: &Pat<'tcx>,
|
||||
refutability: RefutableFlag,
|
||||
) -> Result<(MatchCheckCtxt<'p, 'tcx>, UsefulnessReport<'p, 'tcx>), ErrorGuaranteed> {
|
||||
let cx = self.new_cx(refutability, None);
|
||||
let cx = self.new_cx(refutability, None, pat.span);
|
||||
let pat = self.lower_pattern(&cx, pat)?;
|
||||
let arms = [MatchArm { pat, hir_id: self.lint_level, has_guard: false }];
|
||||
let report = compute_match_usefulness(&cx, &arms, self.lint_level, pat.ty(), pat.span());
|
||||
let report = compute_match_usefulness(&cx, &arms, pat.ty());
|
||||
Ok((cx, report))
|
||||
}
|
||||
|
||||
|
@ -848,7 +848,7 @@ pub(super) fn is_covered_by<'p>(&self, pcx: &PatCtxt<'_, 'p, 'tcx>, other: &Self
|
||||
(Opaque(..), _) | (_, Opaque(..)) => false,
|
||||
|
||||
_ => span_bug!(
|
||||
pcx.span,
|
||||
pcx.cx.scrut_span,
|
||||
"trying to compare incompatible constructors {:?} and {:?}",
|
||||
self,
|
||||
other
|
||||
@ -1249,9 +1249,8 @@ pub(super) fn from_iter(
|
||||
fn wildcards_from_tys(
|
||||
cx: &MatchCheckCtxt<'p, 'tcx>,
|
||||
tys: impl IntoIterator<Item = Ty<'tcx>>,
|
||||
span: Span,
|
||||
) -> Self {
|
||||
Fields::from_iter(cx, tys.into_iter().map(|ty| DeconstructedPat::wildcard(ty, span)))
|
||||
Fields::from_iter(cx, tys.into_iter().map(|ty| DeconstructedPat::wildcard(ty, DUMMY_SP)))
|
||||
}
|
||||
|
||||
// In the cases of either a `#[non_exhaustive]` field list or a non-public field, we hide
|
||||
@ -1287,18 +1286,18 @@ fn list_variant_nonhidden_fields<'a>(
|
||||
pub(super) fn wildcards(pcx: &PatCtxt<'_, 'p, 'tcx>, constructor: &Constructor<'tcx>) -> Self {
|
||||
let ret = match constructor {
|
||||
Single | Variant(_) => match pcx.ty.kind() {
|
||||
ty::Tuple(fs) => Fields::wildcards_from_tys(pcx.cx, fs.iter(), pcx.span),
|
||||
ty::Ref(_, rty, _) => Fields::wildcards_from_tys(pcx.cx, once(*rty), pcx.span),
|
||||
ty::Tuple(fs) => Fields::wildcards_from_tys(pcx.cx, fs.iter()),
|
||||
ty::Ref(_, rty, _) => Fields::wildcards_from_tys(pcx.cx, once(*rty)),
|
||||
ty::Adt(adt, args) => {
|
||||
if adt.is_box() {
|
||||
// The only legal patterns of type `Box` (outside `std`) are `_` and box
|
||||
// patterns. If we're here we can assume this is a box pattern.
|
||||
Fields::wildcards_from_tys(pcx.cx, once(args.type_at(0)), pcx.span)
|
||||
Fields::wildcards_from_tys(pcx.cx, once(args.type_at(0)))
|
||||
} else {
|
||||
let variant = &adt.variant(constructor.variant_index_for_adt(*adt));
|
||||
let tys = Fields::list_variant_nonhidden_fields(pcx.cx, pcx.ty, variant)
|
||||
.map(|(_, ty)| ty);
|
||||
Fields::wildcards_from_tys(pcx.cx, tys, pcx.span)
|
||||
Fields::wildcards_from_tys(pcx.cx, tys)
|
||||
}
|
||||
}
|
||||
_ => bug!("Unexpected type for `Single` constructor: {:?}", pcx),
|
||||
@ -1306,7 +1305,7 @@ pub(super) fn wildcards(pcx: &PatCtxt<'_, 'p, 'tcx>, constructor: &Constructor<'
|
||||
Slice(slice) => match *pcx.ty.kind() {
|
||||
ty::Slice(ty) | ty::Array(ty, _) => {
|
||||
let arity = slice.arity();
|
||||
Fields::wildcards_from_tys(pcx.cx, (0..arity).map(|_| ty), pcx.span)
|
||||
Fields::wildcards_from_tys(pcx.cx, (0..arity).map(|_| ty))
|
||||
}
|
||||
_ => bug!("bad slice pattern {:?} {:?}", constructor, pcx),
|
||||
},
|
||||
@ -1625,7 +1624,7 @@ pub(super) fn specialize<'a>(
|
||||
let wildcard: &_ = pcx
|
||||
.cx
|
||||
.pattern_arena
|
||||
.alloc(DeconstructedPat::wildcard(inner_ty, pcx.span));
|
||||
.alloc(DeconstructedPat::wildcard(inner_ty, DUMMY_SP));
|
||||
let extra_wildcards = other_slice.arity() - self_slice.arity();
|
||||
let extra_wildcards = (0..extra_wildcards).map(|_| wildcard);
|
||||
prefix.iter().chain(extra_wildcards).chain(suffix).collect()
|
||||
|
@ -521,8 +521,12 @@ pub(crate) struct MatchCheckCtxt<'p, 'tcx> {
|
||||
pub(crate) module: DefId,
|
||||
pub(crate) param_env: ty::ParamEnv<'tcx>,
|
||||
pub(crate) pattern_arena: &'p TypedArena<DeconstructedPat<'p, 'tcx>>,
|
||||
/// Lint level at the match.
|
||||
pub(crate) match_lint_level: HirId,
|
||||
/// The span of the whole match, if applicable.
|
||||
pub(crate) match_span: Option<Span>,
|
||||
/// Span of the scrutinee.
|
||||
pub(crate) scrut_span: Span,
|
||||
/// Only produce `NON_EXHAUSTIVE_OMITTED_PATTERNS` lint on refutable patterns.
|
||||
pub(crate) refutable: bool,
|
||||
}
|
||||
@ -552,8 +556,6 @@ pub(super) struct PatCtxt<'a, 'p, 'tcx> {
|
||||
pub(super) cx: &'a MatchCheckCtxt<'p, 'tcx>,
|
||||
/// Type of the current column under investigation.
|
||||
pub(super) ty: Ty<'tcx>,
|
||||
/// Span of the current pattern under investigation.
|
||||
pub(super) span: Span,
|
||||
/// Whether the current pattern is the whole pattern as found in a match arm, or if it's a
|
||||
/// subpattern.
|
||||
pub(super) is_top_level: bool,
|
||||
@ -1020,7 +1022,7 @@ fn compute_exhaustiveness_and_reachability<'p, 'tcx>(
|
||||
};
|
||||
|
||||
debug!("ty: {ty:?}");
|
||||
let pcx = &PatCtxt { cx, ty, span: DUMMY_SP, is_top_level };
|
||||
let pcx = &PatCtxt { cx, ty, is_top_level };
|
||||
|
||||
// Analyze the constructors present in this column.
|
||||
let ctors = matrix.heads().map(|p| p.ctor());
|
||||
@ -1169,7 +1171,7 @@ fn collect_nonexhaustive_missing_variants<'p, 'tcx>(
|
||||
let Some(ty) = column.head_ty() else {
|
||||
return Vec::new();
|
||||
};
|
||||
let pcx = &PatCtxt { cx, ty, span: DUMMY_SP, is_top_level: false };
|
||||
let pcx = &PatCtxt { cx, ty, is_top_level: false };
|
||||
|
||||
let set = column.analyze_ctors(pcx);
|
||||
if set.present.is_empty() {
|
||||
@ -1210,16 +1212,15 @@ fn collect_nonexhaustive_missing_variants<'p, 'tcx>(
|
||||
}
|
||||
|
||||
/// Traverse the patterns to warn the user about ranges that overlap on their endpoints.
|
||||
#[instrument(level = "debug", skip(cx, lint_root))]
|
||||
#[instrument(level = "debug", skip(cx))]
|
||||
fn lint_overlapping_range_endpoints<'p, 'tcx>(
|
||||
cx: &MatchCheckCtxt<'p, 'tcx>,
|
||||
column: &PatternColumn<'p, 'tcx>,
|
||||
lint_root: HirId,
|
||||
) {
|
||||
let Some(ty) = column.head_ty() else {
|
||||
return;
|
||||
};
|
||||
let pcx = &PatCtxt { cx, ty, span: DUMMY_SP, is_top_level: false };
|
||||
let pcx = &PatCtxt { cx, ty, is_top_level: false };
|
||||
|
||||
let set = column.analyze_ctors(pcx);
|
||||
|
||||
@ -1233,7 +1234,7 @@ fn lint_overlapping_range_endpoints<'p, 'tcx>(
|
||||
.collect();
|
||||
cx.tcx.emit_spanned_lint(
|
||||
lint::builtin::OVERLAPPING_RANGE_ENDPOINTS,
|
||||
lint_root,
|
||||
cx.match_lint_level,
|
||||
this_span,
|
||||
OverlappingRangeEndpoints { overlap: overlaps, range: this_span },
|
||||
);
|
||||
@ -1278,7 +1279,7 @@ fn lint_overlapping_range_endpoints<'p, 'tcx>(
|
||||
// Recurse into the fields.
|
||||
for ctor in set.present {
|
||||
for col in column.specialize(pcx, &ctor) {
|
||||
lint_overlapping_range_endpoints(cx, &col, lint_root);
|
||||
lint_overlapping_range_endpoints(cx, &col);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1319,9 +1320,7 @@ pub(crate) struct UsefulnessReport<'p, 'tcx> {
|
||||
pub(crate) fn compute_match_usefulness<'p, 'tcx>(
|
||||
cx: &MatchCheckCtxt<'p, 'tcx>,
|
||||
arms: &[MatchArm<'p, 'tcx>],
|
||||
lint_root: HirId,
|
||||
scrut_ty: Ty<'tcx>,
|
||||
scrut_span: Span,
|
||||
) -> UsefulnessReport<'p, 'tcx> {
|
||||
let mut matrix = Matrix::new(cx, arms.iter(), scrut_ty);
|
||||
let non_exhaustiveness_witnesses =
|
||||
@ -1345,13 +1344,13 @@ pub(crate) fn compute_match_usefulness<'p, 'tcx>(
|
||||
|
||||
let pat_column = PatternColumn::new(matrix.heads().collect());
|
||||
// Lint on ranges that overlap on their endpoints, which is likely a mistake.
|
||||
lint_overlapping_range_endpoints(cx, &pat_column, lint_root);
|
||||
lint_overlapping_range_endpoints(cx, &pat_column);
|
||||
|
||||
// Run the non_exhaustive_omitted_patterns lint. Only run on refutable patterns to avoid hitting
|
||||
// `if let`s. Only run if the match is exhaustive otherwise the error is redundant.
|
||||
if cx.refutable && report.non_exhaustiveness_witnesses.is_empty() {
|
||||
if !matches!(
|
||||
cx.tcx.lint_level_at_node(NON_EXHAUSTIVE_OMITTED_PATTERNS, lint_root).0,
|
||||
cx.tcx.lint_level_at_node(NON_EXHAUSTIVE_OMITTED_PATTERNS, cx.match_lint_level).0,
|
||||
rustc_session::lint::Level::Allow
|
||||
) {
|
||||
let witnesses = collect_nonexhaustive_missing_variants(cx, &pat_column);
|
||||
@ -1362,11 +1361,11 @@ pub(crate) fn compute_match_usefulness<'p, 'tcx>(
|
||||
// NB: The partner lint for structs lives in `compiler/rustc_hir_analysis/src/check/pat.rs`.
|
||||
cx.tcx.emit_spanned_lint(
|
||||
NON_EXHAUSTIVE_OMITTED_PATTERNS,
|
||||
lint_root,
|
||||
scrut_span,
|
||||
cx.match_lint_level,
|
||||
cx.scrut_span,
|
||||
NonExhaustiveOmittedPattern {
|
||||
scrut_ty,
|
||||
uncovered: Uncovered::new(scrut_span, cx, witnesses),
|
||||
uncovered: Uncovered::new(cx.scrut_span, cx, witnesses),
|
||||
},
|
||||
);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user