Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 14f186c

Browse files
Store Place instead of PlaceBuilder in MatchPair
1 parent 3878b37 commit 14f186c

File tree

3 files changed

+33
-28
lines changed

3 files changed

+33
-28
lines changed

‎compiler/rustc_mir_build/src/build/matches/mod.rs‎

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1106,7 +1106,10 @@ impl<'pat, 'tcx> TestCase<'pat, 'tcx> {
11061106
#[derive(Debug, Clone)]
11071107
pub(crate) struct MatchPair<'pat, 'tcx> {
11081108
/// This place...
1109-
place: PlaceBuilder<'tcx>,
1109+
// This can be `None` if it referred to a non-captured place in a closure.
1110+
// Invariant: place.is_none() => test_case is Irrefutable
1111+
// In other words this must be `Some(_)` after simplification.
1112+
place: Option<Place<'tcx>>,
11101113

11111114
/// ... must pass this test...
11121115
// Invariant: after creation and simplification in `Candidate::new()`, this must not be
@@ -1587,11 +1590,12 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
15871590
fn pick_test(
15881591
&mut self,
15891592
candidates: &mut [&mut Candidate<'_, 'tcx>],
1590-
) -> (PlaceBuilder<'tcx>, Test<'tcx>) {
1593+
) -> (Place<'tcx>, Test<'tcx>) {
15911594
// Extract the match-pair from the highest priority candidate
15921595
let match_pair = &candidates.first().unwrap().match_pairs[0];
15931596
let test = self.test(match_pair);
1594-
let match_place = match_pair.place.clone();
1597+
// Unwrap is ok after simplification.
1598+
let match_place = match_pair.place.unwrap();
15951599
debug!(?test, ?match_pair);
15961600

15971601
(match_place, test)
@@ -1632,7 +1636,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
16321636
/// - candidate 1 becomes `[y @ false]` since we know that `x` was `false`.
16331637
fn sort_candidates<'b, 'c, 'pat>(
16341638
&mut self,
1635-
match_place: &PlaceBuilder<'tcx>,
1639+
match_place: Place<'tcx>,
16361640
test: &Test<'tcx>,
16371641
mut candidates: &'b mut [&'c mut Candidate<'pat, 'tcx>],
16381642
) -> (
@@ -1650,7 +1654,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
16501654
// sorting.
16511655
while let Some(candidate) = candidates.first_mut() {
16521656
let Some(branch) =
1653-
self.sort_candidate(&match_place, test, candidate, &target_candidates)
1657+
self.sort_candidate(match_place, test, candidate, &target_candidates)
16541658
else {
16551659
break;
16561660
};
@@ -1778,7 +1782,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
17781782
// For each of the N possible test outcomes, build the vector of candidates that applies if
17791783
// the test has that particular outcome.
17801784
let (remaining_candidates, target_candidates) =
1781-
self.sort_candidates(&match_place, &test, candidates);
1785+
self.sort_candidates(match_place, &test, candidates);
17821786

17831787
// The block that we should branch to if none of the
17841788
// `target_candidates` match.
@@ -1818,7 +1822,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
18181822
scrutinee_span,
18191823
start_block,
18201824
remainder_start,
1821-
&match_place,
1825+
match_place,
18221826
&test,
18231827
target_blocks,
18241828
);

‎compiler/rustc_mir_build/src/build/matches/test.rs‎

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
// identify what tests are needed, perform the tests, and then filter
66
// the candidates based on the result.
77

8-
use crate::build::expr::as_place::PlaceBuilder;
98
use crate::build::matches::{Candidate, MatchPair, Test, TestBranch, TestCase, TestKind};
109
use crate::build::Builder;
1110
use rustc_data_structures::fx::FxIndexMap;
@@ -55,18 +54,17 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
5554
Test { span: match_pair.pattern.span, kind }
5655
}
5756

58-
#[instrument(skip(self, target_blocks, place_builder), level = "debug")]
57+
#[instrument(skip(self, target_blocks, place), level = "debug")]
5958
pub(super) fn perform_test(
6059
&mut self,
6160
match_start_span: Span,
6261
scrutinee_span: Span,
6362
block: BasicBlock,
6463
otherwise_block: BasicBlock,
65-
place_builder:&PlaceBuilder<'tcx>,
64+
place:Place<'tcx>,
6665
test: &Test<'tcx>,
6766
target_blocks: FxIndexMap<TestBranch<'tcx>, BasicBlock>,
6867
) {
69-
let place = place_builder.to_place(self);
7068
let place_ty = place.ty(&self.local_decls, self.tcx);
7169
debug!(?place, ?place_ty);
7270
let target_block = |branch| target_blocks.get(&branch).copied().unwrap_or(otherwise_block);
@@ -475,7 +473,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
475473
/// tighter match code if we do something a bit different.
476474
pub(super) fn sort_candidate(
477475
&mut self,
478-
test_place: &PlaceBuilder<'tcx>,
476+
test_place: Place<'tcx>,
479477
test: &Test<'tcx>,
480478
candidate: &mut Candidate<'_, 'tcx>,
481479
sorted_candidates: &FxIndexMap<TestBranch<'tcx>, Vec<&mut Candidate<'_, 'tcx>>>,
@@ -486,8 +484,11 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
486484
// than one, but it'd be very unusual to have two sides that
487485
// both require tests; you'd expect one side to be simplified
488486
// away.)
489-
let (match_pair_index, match_pair) =
490-
candidate.match_pairs.iter().enumerate().find(|&(_, mp)| mp.place == *test_place)?;
487+
let (match_pair_index, match_pair) = candidate
488+
.match_pairs
489+
.iter()
490+
.enumerate()
491+
.find(|&(_, mp)| mp.place == Some(test_place))?;
491492

492493
let fully_matched;
493494
let ret = match (&test.kind, &match_pair.test_case) {
@@ -521,7 +522,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
521522
candidate
522523
.match_pairs
523524
.iter()
524-
.any(|mp| mp.place == *test_place && is_covering_range(&mp.test_case))
525+
.any(|mp| mp.place == Some(test_place) && is_covering_range(&mp.test_case))
525526
};
526527
if sorted_candidates
527528
.get(&TestBranch::Failure)

‎compiler/rustc_mir_build/src/build/matches/util.rs‎

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ impl<'pat, 'tcx> MatchPair<'pat, 'tcx> {
119119
place_builder = place_builder.project(ProjectionElem::OpaqueCast(pattern.ty));
120120
}
121121

122+
let place = place_builder.try_to_place(cx);
122123
let default_irrefutable = || TestCase::Irrefutable { binding: None, ascription: None };
123124
let mut subpairs = Vec::new();
124125
let test_case = match pattern.kind {
@@ -143,13 +144,13 @@ impl<'pat, 'tcx> MatchPair<'pat, 'tcx> {
143144
..
144145
} => {
145146
// Apply the type ascription to the value at `match_pair.place`
146-
let ascription = place_builder.try_to_place(cx).map(|source| super::Ascription {
147+
let ascription = place.map(|source| super::Ascription {
147148
annotation: annotation.clone(),
148149
source,
149150
variance,
150151
});
151152

152-
subpairs.push(MatchPair::new(place_builder.clone(), subpattern, cx));
153+
subpairs.push(MatchPair::new(place_builder, subpattern, cx));
153154
TestCase::Irrefutable { ascription, binding: None }
154155
}
155156

@@ -162,7 +163,7 @@ impl<'pat, 'tcx> MatchPair<'pat, 'tcx> {
162163
ref subpattern,
163164
is_primary: _,
164165
} => {
165-
let binding = place_builder.try_to_place(cx).map(|source| super::Binding {
166+
let binding = place.map(|source| super::Binding {
166167
span: pattern.span,
167168
source,
168169
var_id: var,
@@ -171,14 +172,14 @@ impl<'pat, 'tcx> MatchPair<'pat, 'tcx> {
171172

172173
if let Some(subpattern) = subpattern.as_ref() {
173174
// this is the `x @ P` case; have to keep matching against `P` now
174-
subpairs.push(MatchPair::new(place_builder.clone(), subpattern, cx));
175+
subpairs.push(MatchPair::new(place_builder, subpattern, cx));
175176
}
176177
TestCase::Irrefutable { ascription: None, binding }
177178
}
178179

179180
PatKind::InlineConstant { subpattern: ref pattern, def, .. } => {
180181
// Apply a type ascription for the inline constant to the value at `match_pair.place`
181-
let ascription = place_builder.try_to_place(cx).map(|source| {
182+
let ascription = place.map(|source| {
182183
let span = pattern.span;
183184
let parent_id = cx.tcx.typeck_root_def_id(cx.def_id.to_def_id());
184185
let args = ty::InlineConstArgs::new(
@@ -204,7 +205,7 @@ impl<'pat, 'tcx> MatchPair<'pat, 'tcx> {
204205
super::Ascription { annotation, source, variance: ty::Contravariant }
205206
});
206207

207-
subpairs.push(MatchPair::new(place_builder.clone(), pattern, cx));
208+
subpairs.push(MatchPair::new(place_builder, pattern, cx));
208209
TestCase::Irrefutable { ascription, binding: None }
209210
}
210211

@@ -226,7 +227,7 @@ impl<'pat, 'tcx> MatchPair<'pat, 'tcx> {
226227
}
227228

228229
PatKind::Variant { adt_def, variant_index, args, ref subpatterns } => {
229-
let downcast_place = place_builder.clone().downcast(adt_def, variant_index); // `(x as Variant)`
230+
let downcast_place = place_builder.downcast(adt_def, variant_index); // `(x as Variant)`
230231
subpairs = cx.field_match_pairs(downcast_place, subpatterns);
231232

232233
let irrefutable = adt_def.variants().iter_enumerated().all(|(i, v)| {
@@ -248,13 +249,12 @@ impl<'pat, 'tcx> MatchPair<'pat, 'tcx> {
248249
}
249250

250251
PatKind::Leaf { ref subpatterns } => {
251-
subpairs = cx.field_match_pairs(place_builder.clone(), subpatterns);
252+
subpairs = cx.field_match_pairs(place_builder, subpatterns);
252253
default_irrefutable()
253254
}
254255

255256
PatKind::Deref { ref subpattern } => {
256-
let place_builder = place_builder.clone().deref();
257-
subpairs.push(MatchPair::new(place_builder, subpattern, cx));
257+
subpairs.push(MatchPair::new(place_builder.deref(), subpattern, cx));
258258
default_irrefutable()
259259
}
260260

@@ -265,7 +265,7 @@ impl<'pat, 'tcx> MatchPair<'pat, 'tcx> {
265265
}
266266
};
267267

268-
MatchPair { place: place_builder, test_case, subpairs, pattern }
268+
MatchPair { place, test_case, subpairs, pattern }
269269
}
270270
}
271271

@@ -311,8 +311,8 @@ impl<'a, 'b, 'tcx> FakeBorrowCollector<'a, 'b, 'tcx> {
311311
}
312312
} else {
313313
// Insert a Shallow borrow of any place that is switched on.
314-
if let Some(resolved_place) = match_pair.place.try_to_place(self.cx) {
315-
self.fake_borrows.insert(resolved_place);
314+
if let Some(place) = match_pair.place {
315+
self.fake_borrows.insert(place);
316316
}
317317

318318
for subpair in &match_pair.subpairs {

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /