Skip to content

Commit

Permalink
Make MatchPairTree::place non-optional
Browse files Browse the repository at this point in the history
As the invariant indicated, this place could only be none for
`TestCase::Irrefutable` nodes, which no longer exist.
  • Loading branch information
Zalathar committed Mar 2, 2025
1 parent ddff70d commit 4f6c44b
Show file tree
Hide file tree
Showing 4 changed files with 9 additions and 23 deletions.
3 changes: 2 additions & 1 deletion compiler/rustc_mir_build/src/builder/matches/match_pair.rs
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ impl<'tcx> MatchPairTree<'tcx> {
place_builder = place_builder.project(ProjectionElem::OpaqueCast(pattern.ty));
}

// Place can be none if the pattern refers to a non-captured place in a closure.
let place = place_builder.try_to_place(cx);
let mut subpairs = Vec::new();
let test_case = match pattern.kind {
Expand Down Expand Up @@ -321,7 +322,7 @@ impl<'tcx> MatchPairTree<'tcx> {
// This pattern is refutable, so push a new match-pair node.
sort_match_pairs(&mut subpairs);
match_pairs.push(MatchPairTree {
place,
place: place.expect("refutable patterns should always have a place to inspect"),
test_case,
subpairs,
pattern_ty: pattern.ty,
Expand Down
12 changes: 2 additions & 10 deletions compiler/rustc_mir_build/src/builder/matches/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1252,13 +1252,7 @@ impl<'tcx> TestCase<'tcx> {
#[derive(Debug, Clone)]
pub(crate) struct MatchPairTree<'tcx> {
/// This place...
///
/// ---
/// This can be `None` if it referred to a non-captured place in a closure.
///
/// Invariant: Can only be `None` when `test_case` is `Irrefutable`.
/// Therefore this must be `Some(_)` after simplification.
place: Option<Place<'tcx>>,
place: Place<'tcx>,

/// ... must pass this test...
test_case: TestCase<'tcx>,
Expand Down Expand Up @@ -2080,11 +2074,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
// Extract the match-pair from the highest priority candidate
let match_pair = &candidates[0].match_pairs[0];
let test = self.pick_test_for_match_pair(match_pair);
// Unwrap is ok after simplification.
let match_place = match_pair.place.unwrap();
debug!(?test, ?match_pair);

(match_place, test)
(match_pair.place, test)
}

/// Given a test, we partition the input candidates into several buckets.
Expand Down
9 changes: 3 additions & 6 deletions compiler/rustc_mir_build/src/builder/matches/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -540,11 +540,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
// than one, but it'd be very unusual to have two sides that
// both require tests; you'd expect one side to be simplified
// away.)
let (match_pair_index, match_pair) = candidate
.match_pairs
.iter()
.enumerate()
.find(|&(_, mp)| mp.place == Some(test_place))?;
let (match_pair_index, match_pair) =
candidate.match_pairs.iter().enumerate().find(|&(_, mp)| mp.place == test_place)?;

// If true, the match pair is completely entailed by its corresponding test
// branch, so it can be removed. If false, the match pair is _compatible_
Expand Down Expand Up @@ -587,7 +584,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
candidate
.match_pairs
.iter()
.any(|mp| mp.place == Some(test_place) && is_covering_range(&mp.test_case))
.any(|mp| mp.place == test_place && is_covering_range(&mp.test_case))
};
if sorted_candidates
.get(&TestBranch::Failure)
Expand Down
8 changes: 2 additions & 6 deletions compiler/rustc_mir_build/src/builder/matches/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -173,14 +173,10 @@ impl<'a, 'b, 'tcx> FakeBorrowCollector<'a, 'b, 'tcx> {
// }
// ```
// Hence we fake borrow using a deep borrow.
if let Some(place) = match_pair.place {
self.fake_borrow(place, FakeBorrowKind::Deep);
}
self.fake_borrow(match_pair.place, FakeBorrowKind::Deep);
} else {
// Insert a Shallow borrow of any place that is switched on.
if let Some(place) = match_pair.place {
self.fake_borrow(place, FakeBorrowKind::Shallow);
}
self.fake_borrow(match_pair.place, FakeBorrowKind::Shallow);

for subpair in &match_pair.subpairs {
self.visit_match_pair(subpair);
Expand Down

0 comments on commit 4f6c44b

Please sign in to comment.