Skip to content

Commit cb9be3e

Browse files
committed
Add 'thir lifetime to RustMatchCheckCtxt
1 parent e764f6d commit cb9be3e

File tree

6 files changed

+96
-81
lines changed

6 files changed

+96
-81
lines changed

compiler/rustc_mir_build/src/errors.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -453,14 +453,14 @@ pub enum UnusedUnsafeEnclosing {
453453
},
454454
}
455455

456-
pub(crate) struct NonExhaustivePatternsTypeNotEmpty<'p, 'tcx, 'm> {
457-
pub cx: &'m RustcMatchCheckCtxt<'p, 'tcx>,
456+
pub(crate) struct NonExhaustivePatternsTypeNotEmpty<'p, 'thir, 'tcx, 'm> {
457+
pub cx: &'m RustcMatchCheckCtxt<'p, 'thir, 'tcx>,
458458
pub expr_span: Span,
459459
pub span: Span,
460460
pub ty: Ty<'tcx>,
461461
}
462462

463-
impl<'a> IntoDiagnostic<'a> for NonExhaustivePatternsTypeNotEmpty<'_, '_, '_> {
463+
impl<'a> IntoDiagnostic<'a> for NonExhaustivePatternsTypeNotEmpty<'_, '_, '_, '_> {
464464
fn into_diagnostic(
465465
self,
466466
dcx: &'a DiagCtxt,

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

+22-21
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ struct MatchVisitor<'thir, 'p, 'tcx> {
8686
thir: &'thir Thir<'tcx>,
8787
lint_level: HirId,
8888
let_source: LetSource,
89-
pattern_arena: &'p TypedArena<DeconstructedPat<'p, 'tcx>>,
89+
pattern_arena: &'p TypedArena<DeconstructedPat<'p, 'thir, 'tcx>>,
9090
dropless_arena: &'p DroplessArena,
9191
/// Tracks if we encountered an error while checking this body. That the first function to
9292
/// report it stores it here. Some functions return `Result` to allow callers to short-circuit
@@ -279,9 +279,9 @@ impl<'thir, 'p, 'tcx> MatchVisitor<'thir, 'p, 'tcx> {
279279

280280
fn lower_pattern(
281281
&mut self,
282-
cx: &MatchCheckCtxt<'p, 'tcx>,
282+
cx: &MatchCheckCtxt<'p, 'thir, 'tcx>,
283283
pat: &'thir Pat<'tcx>,
284-
) -> Result<&'p DeconstructedPat<'p, 'tcx>, ErrorGuaranteed> {
284+
) -> Result<&'p DeconstructedPat<'p, 'thir, 'tcx>, ErrorGuaranteed> {
285285
if let Err(err) = pat.pat_error_reported() {
286286
self.error = Err(err);
287287
Err(err)
@@ -374,7 +374,7 @@ impl<'thir, 'p, 'tcx> MatchVisitor<'thir, 'p, 'tcx> {
374374
whole_match_span: Option<Span>,
375375
scrutinee: Option<&Expr<'tcx>>,
376376
scrut_span: Span,
377-
) -> MatchCheckCtxt<'p, 'tcx> {
377+
) -> MatchCheckCtxt<'p, 'thir, 'tcx> {
378378
let refutable = match refutability {
379379
Irrefutable => false,
380380
Refutable => true,
@@ -554,7 +554,8 @@ impl<'thir, 'p, 'tcx> MatchVisitor<'thir, 'p, 'tcx> {
554554
pat: &'thir Pat<'tcx>,
555555
refutability: RefutableFlag,
556556
scrut: Option<&Expr<'tcx>>,
557-
) -> Result<(MatchCheckCtxt<'p, 'tcx>, UsefulnessReport<'p, 'tcx>), ErrorGuaranteed> {
557+
) -> Result<(MatchCheckCtxt<'p, 'thir, 'tcx>, UsefulnessReport<'p, 'thir, 'tcx>), ErrorGuaranteed>
558+
{
558559
let cx = self.new_cx(refutability, None, scrut, pat.span);
559560
let pat = self.lower_pattern(&cx, pat)?;
560561
let arms = [MatchArm { pat, arm_data: self.lint_level, has_guard: false }];
@@ -840,9 +841,9 @@ fn report_irrefutable_let_patterns(
840841
}
841842

842843
/// Report unreachable arms, if any.
843-
fn report_arm_reachability<'p, 'tcx>(
844-
cx: &MatchCheckCtxt<'p, 'tcx>,
845-
report: &UsefulnessReport<'p, 'tcx>,
844+
fn report_arm_reachability<'p, 'thir, 'tcx>(
845+
cx: &MatchCheckCtxt<'p, 'thir, 'tcx>,
846+
report: &UsefulnessReport<'p, 'thir, 'tcx>,
846847
) {
847848
let report_unreachable_pattern = |span, hir_id, catchall: Option<Span>| {
848849
cx.tcx.emit_spanned_lint(
@@ -880,7 +881,7 @@ fn report_arm_reachability<'p, 'tcx>(
880881
}
881882

882883
/// Checks for common cases of "catchall" patterns that may not be intended as such.
883-
fn pat_is_catchall(pat: &DeconstructedPat<'_, '_>) -> bool {
884+
fn pat_is_catchall(pat: &DeconstructedPat<'_, '_, '_>) -> bool {
884885
match pat.ctor() {
885886
Constructor::Wildcard => true,
886887
Constructor::Struct | Constructor::Ref => pat.iter_fields().all(|pat| pat_is_catchall(pat)),
@@ -889,12 +890,12 @@ fn pat_is_catchall(pat: &DeconstructedPat<'_, '_>) -> bool {
889890
}
890891

891892
/// Report that a match is not exhaustive.
892-
fn report_non_exhaustive_match<'p, 'tcx>(
893-
cx: &MatchCheckCtxt<'p, 'tcx>,
893+
fn report_non_exhaustive_match<'p, 'thir, 'tcx>(
894+
cx: &MatchCheckCtxt<'p, 'thir, 'tcx>,
894895
thir: &Thir<'tcx>,
895896
scrut_ty: Ty<'tcx>,
896897
sp: Span,
897-
witnesses: Vec<WitnessPat<'p, 'tcx>>,
898+
witnesses: Vec<WitnessPat<'p, 'thir, 'tcx>>,
898899
arms: &[ArmId],
899900
expr_span: Span,
900901
) -> ErrorGuaranteed {
@@ -1089,12 +1090,12 @@ fn report_non_exhaustive_match<'p, 'tcx>(
10891090
err.emit()
10901091
}
10911092

1092-
fn joined_uncovered_patterns<'p, 'tcx>(
1093-
cx: &MatchCheckCtxt<'p, 'tcx>,
1094-
witnesses: &[WitnessPat<'p, 'tcx>],
1093+
fn joined_uncovered_patterns<'p, 'thir, 'tcx>(
1094+
cx: &MatchCheckCtxt<'p, 'thir, 'tcx>,
1095+
witnesses: &[WitnessPat<'p, 'thir, 'tcx>],
10951096
) -> String {
10961097
const LIMIT: usize = 3;
1097-
let pat_to_str = |pat: &WitnessPat<'p, 'tcx>| cx.hoist_witness_pat(pat).to_string();
1098+
let pat_to_str = |pat: &WitnessPat<'p, 'thir, 'tcx>| cx.hoist_witness_pat(pat).to_string();
10981099
match witnesses {
10991100
[] => bug!(),
11001101
[witness] => format!("`{}`", cx.hoist_witness_pat(witness)),
@@ -1111,8 +1112,8 @@ fn joined_uncovered_patterns<'p, 'tcx>(
11111112
}
11121113

11131114
fn collect_non_exhaustive_tys<'tcx>(
1114-
cx: &MatchCheckCtxt<'_, 'tcx>,
1115-
pat: &WitnessPat<'_, 'tcx>,
1115+
cx: &MatchCheckCtxt<'_, '_, 'tcx>,
1116+
pat: &WitnessPat<'_, '_, 'tcx>,
11161117
non_exhaustive_tys: &mut FxIndexSet<Ty<'tcx>>,
11171118
) {
11181119
if matches!(pat.ctor(), Constructor::NonExhaustive) {
@@ -1131,7 +1132,7 @@ fn collect_non_exhaustive_tys<'tcx>(
11311132
fn report_adt_defined_here<'tcx>(
11321133
tcx: TyCtxt<'tcx>,
11331134
ty: Ty<'tcx>,
1134-
witnesses: &[WitnessPat<'_, 'tcx>],
1135+
witnesses: &[WitnessPat<'_, '_, 'tcx>],
11351136
point_at_non_local_ty: bool,
11361137
) -> Option<AdtDefinedHere<'tcx>> {
11371138
let ty = ty.peel_refs();
@@ -1153,10 +1154,10 @@ fn report_adt_defined_here<'tcx>(
11531154
Some(AdtDefinedHere { adt_def_span, ty, variants })
11541155
}
11551156

1156-
fn maybe_point_at_variant<'a, 'p: 'a, 'tcx: 'p>(
1157+
fn maybe_point_at_variant<'a, 'p: 'a, 'thir: 'p, 'tcx: 'thir>(
11571158
tcx: TyCtxt<'tcx>,
11581159
def: AdtDef<'tcx>,
1159-
patterns: impl Iterator<Item = &'a WitnessPat<'p, 'tcx>>,
1160+
patterns: impl Iterator<Item = &'a WitnessPat<'p, 'thir, 'tcx>>,
11601161
) -> Vec<Span> {
11611162
let mut covered = vec![];
11621163
for pattern in patterns {

compiler/rustc_pattern_analysis/src/errors.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ pub struct Uncovered<'tcx> {
1919
}
2020

2121
impl<'tcx> Uncovered<'tcx> {
22-
pub fn new<'p>(
22+
pub fn new<'p, 'thir>(
2323
span: Span,
24-
cx: &RustcMatchCheckCtxt<'p, 'tcx>,
25-
witnesses: Vec<WitnessPat<'p, 'tcx>>,
24+
cx: &RustcMatchCheckCtxt<'p, 'thir, 'tcx>,
25+
witnesses: Vec<WitnessPat<'p, 'thir, 'tcx>>,
2626
) -> Self {
2727
let witness_1 = cx.hoist_witness_pat(witnesses.get(0).unwrap());
2828
Self {

compiler/rustc_pattern_analysis/src/lib.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,11 @@ pub struct MatchArm<'p, Cx: TypeCx> {
107107
/// The entrypoint for this crate. Computes whether a match is exhaustive and which of its arms are
108108
/// useful, and runs some lints.
109109
#[cfg(feature = "rustc")]
110-
pub fn analyze_match<'p, 'tcx>(
111-
tycx: &RustcMatchCheckCtxt<'p, 'tcx>,
112-
arms: &[rustc::MatchArm<'p, 'tcx>],
110+
pub fn analyze_match<'p, 'thir, 'tcx>(
111+
tycx: &RustcMatchCheckCtxt<'p, 'thir, 'tcx>,
112+
arms: &[rustc::MatchArm<'p, 'thir, 'tcx>],
113113
scrut_ty: Ty<'tcx>,
114-
) -> rustc::UsefulnessReport<'p, 'tcx> {
114+
) -> rustc::UsefulnessReport<'p, 'thir, 'tcx> {
115115
// Arena to store the extra wildcards we construct during analysis.
116116
let wildcard_arena = tycx.pattern_arena;
117117
let scrut_validity = ValidityConstraint::from_bool(tycx.known_valid_scrutinee);

compiler/rustc_pattern_analysis/src/lints.rs

+28-23
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@ use crate::TypeCx;
2828
///
2929
/// This is not used in the main algorithm; only in lints.
3030
#[derive(Debug)]
31-
pub(crate) struct PatternColumn<'a, 'p, 'tcx> {
32-
patterns: Vec<&'a DeconstructedPat<'p, 'tcx>>,
31+
pub(crate) struct PatternColumn<'a, 'p, 'thir, 'tcx> {
32+
patterns: Vec<&'a DeconstructedPat<'p, 'thir, 'tcx>>,
3333
}
3434

35-
impl<'a, 'p, 'tcx> PatternColumn<'a, 'p, 'tcx> {
36-
pub(crate) fn new(arms: &[MatchArm<'p, 'tcx>]) -> Self {
35+
impl<'a, 'p, 'thir, 'tcx> PatternColumn<'a, 'p, 'thir, 'tcx> {
36+
pub(crate) fn new(arms: &[MatchArm<'p, 'thir, 'tcx>]) -> Self {
3737
let mut patterns = Vec::with_capacity(arms.len());
3838
for arm in arms {
3939
if arm.pat.is_or_pat() {
@@ -48,7 +48,7 @@ impl<'a, 'p, 'tcx> PatternColumn<'a, 'p, 'tcx> {
4848
fn is_empty(&self) -> bool {
4949
self.patterns.is_empty()
5050
}
51-
fn head_ty(&self, cx: MatchCtxt<'a, 'p, 'tcx>) -> Option<Ty<'tcx>> {
51+
fn head_ty(&self, cx: MatchCtxt<'a, 'p, 'thir, 'tcx>) -> Option<Ty<'tcx>> {
5252
if self.patterns.len() == 0 {
5353
return None;
5454
}
@@ -59,12 +59,17 @@ impl<'a, 'p, 'tcx> PatternColumn<'a, 'p, 'tcx> {
5959
}
6060

6161
/// Do constructor splitting on the constructors of the column.
62-
fn analyze_ctors(&self, pcx: &PlaceCtxt<'_, 'p, 'tcx>) -> SplitConstructorSet<'p, 'tcx> {
62+
fn analyze_ctors(
63+
&self,
64+
pcx: &PlaceCtxt<'_, 'p, 'thir, 'tcx>,
65+
) -> SplitConstructorSet<'p, 'thir, 'tcx> {
6366
let column_ctors = self.patterns.iter().map(|p| p.ctor());
6467
pcx.ctors_for_ty().split(pcx, column_ctors)
6568
}
6669

67-
fn iter<'b>(&'b self) -> impl Iterator<Item = &'a DeconstructedPat<'p, 'tcx>> + Captures<'b> {
70+
fn iter<'b>(
71+
&'b self,
72+
) -> impl Iterator<Item = &'a DeconstructedPat<'p, 'thir, 'tcx>> + Captures<'b> {
6873
self.patterns.iter().copied()
6974
}
7075

@@ -75,9 +80,9 @@ impl<'a, 'p, 'tcx> PatternColumn<'a, 'p, 'tcx> {
7580
/// which may change the lengths.
7681
fn specialize(
7782
&self,
78-
pcx: &PlaceCtxt<'a, 'p, 'tcx>,
79-
ctor: &Constructor<'p, 'tcx>,
80-
) -> Vec<PatternColumn<'a, 'p, 'tcx>> {
83+
pcx: &PlaceCtxt<'a, 'p, 'thir, 'tcx>,
84+
ctor: &Constructor<'p, 'thir, 'tcx>,
85+
) -> Vec<PatternColumn<'a, 'p, 'thir, 'tcx>> {
8186
let arity = ctor.arity(pcx);
8287
if arity == 0 {
8388
return Vec::new();
@@ -113,10 +118,10 @@ impl<'a, 'p, 'tcx> PatternColumn<'a, 'p, 'tcx> {
113118
/// Traverse the patterns to collect any variants of a non_exhaustive enum that fail to be mentioned
114119
/// in a given column.
115120
#[instrument(level = "debug", skip(cx), ret)]
116-
fn collect_nonexhaustive_missing_variants<'a, 'p, 'tcx>(
117-
cx: MatchCtxt<'a, 'p, 'tcx>,
118-
column: &PatternColumn<'a, 'p, 'tcx>,
119-
) -> Vec<WitnessPat<'p, 'tcx>> {
121+
fn collect_nonexhaustive_missing_variants<'a, 'p, 'thir, 'tcx>(
122+
cx: MatchCtxt<'a, 'p, 'thir, 'tcx>,
123+
column: &PatternColumn<'a, 'p, 'thir, 'tcx>,
124+
) -> Vec<WitnessPat<'p, 'thir, 'tcx>> {
120125
let Some(ty) = column.head_ty(cx) else {
121126
return Vec::new();
122127
};
@@ -160,13 +165,13 @@ fn collect_nonexhaustive_missing_variants<'a, 'p, 'tcx>(
160165
witnesses
161166
}
162167

163-
pub(crate) fn lint_nonexhaustive_missing_variants<'a, 'p, 'tcx>(
164-
cx: MatchCtxt<'a, 'p, 'tcx>,
165-
arms: &[MatchArm<'p, 'tcx>],
166-
pat_column: &PatternColumn<'a, 'p, 'tcx>,
168+
pub(crate) fn lint_nonexhaustive_missing_variants<'a, 'p, 'thir, 'tcx>(
169+
cx: MatchCtxt<'a, 'p, 'thir, 'tcx>,
170+
arms: &[MatchArm<'p, 'thir, 'tcx>],
171+
pat_column: &PatternColumn<'a, 'p, 'thir, 'tcx>,
167172
scrut_ty: Ty<'tcx>,
168173
) {
169-
let rcx: &RustcMatchCheckCtxt<'_, '_> = cx.tycx;
174+
let rcx: &RustcMatchCheckCtxt<'_, '_, '_> = cx.tycx;
170175
if !matches!(
171176
rcx.tcx.lint_level_at_node(NON_EXHAUSTIVE_OMITTED_PATTERNS, rcx.match_lint_level).0,
172177
rustc_session::lint::Level::Allow
@@ -214,15 +219,15 @@ pub(crate) fn lint_nonexhaustive_missing_variants<'a, 'p, 'tcx>(
214219

215220
/// Traverse the patterns to warn the user about ranges that overlap on their endpoints.
216221
#[instrument(level = "debug", skip(cx))]
217-
pub(crate) fn lint_overlapping_range_endpoints<'a, 'p, 'tcx>(
218-
cx: MatchCtxt<'a, 'p, 'tcx>,
219-
column: &PatternColumn<'a, 'p, 'tcx>,
222+
pub(crate) fn lint_overlapping_range_endpoints<'a, 'p, 'thir, 'tcx>(
223+
cx: MatchCtxt<'a, 'p, 'thir, 'tcx>,
224+
column: &PatternColumn<'a, 'p, 'thir, 'tcx>,
220225
) {
221226
let Some(ty) = column.head_ty(cx) else {
222227
return;
223228
};
224229
let pcx = &PlaceCtxt::new_dummy(cx, ty);
225-
let rcx: &RustcMatchCheckCtxt<'_, '_> = cx.tycx;
230+
let rcx: &RustcMatchCheckCtxt<'_, '_, '_> = cx.tycx;
226231

227232
let set = column.analyze_ctors(pcx);
228233

0 commit comments

Comments
 (0)