Skip to content

Commit 8fdddf6

Browse files
committed
conditionally skip some slicing
1 parent 591d058 commit 8fdddf6

File tree

1 file changed

+10
-3
lines changed

1 file changed

+10
-3
lines changed

compiler/rustc_mir_build/src/builder/matches/match_pair.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,11 +124,18 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
124124
top_pattern: &'pat Pat<'tcx>,
125125
pattern: &'pat [Box<Pat<'tcx>>],
126126
) -> impl Iterator<Item = MatchPairTree<'pat, 'tcx>> + use<'pat, 'tcx, 'a> {
127-
self.find_const_groups(pattern).into_iter().map(move |entry| {
127+
let entries = self.find_const_groups(pattern);
128+
let solo = entries.len() == 1;
129+
130+
let maybe_project = move |base: &PlaceBuilder<'tcx>, elem| {
131+
if solo { base.clone_project(elem) } else { base.clone() }
132+
};
133+
134+
entries.into_iter().map(move |entry| {
128135
let pattern_len = pattern.len() as u64;
129136
let mut build_single = |idx| {
130137
let subpattern = &pattern[idx as usize];
131-
let place = place.clone_project(ProjectionElem::ConstantIndex {
138+
let place = maybe_project(place, ProjectionElem::ConstantIndex {
132139
offset: idx,
133140
min_length: pattern_len,
134141
from_end: false,
@@ -147,7 +154,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
147154
let subpattern = &pattern[range.start as usize..range.end as usize];
148155
let elem_ty = subpattern[0].ty;
149156

150-
let place = place.clone_project(PlaceElem::Subslice {
157+
let place = maybe_project(place, PlaceElem::Subslice {
151158
from: range.start,
152159
to: pattern.len() as u64 - range.end,
153160
from_end: true,

0 commit comments

Comments
 (0)