@@ -1293,7 +1293,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
1293
1293
//
1294
1294
// only generates a single switch.
1295
1295
let match_pair = candidate. match_pairs . pop ( ) . unwrap ( ) ;
1296
- self . create_or_subcandidates ( candidate, & match_pair) ;
1296
+ self . create_or_subcandidates ( candidate, match_pair) ;
1297
1297
split_or_candidate = true ;
1298
1298
}
1299
1299
}
@@ -1481,9 +1481,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
1481
1481
return ;
1482
1482
}
1483
1483
1484
- let match_pairs = mem:: take ( & mut first_candidate. match_pairs ) ;
1485
- let ( first_match_pair, remaining_match_pairs) = match_pairs. split_first ( ) . unwrap ( ) ;
1486
-
1484
+ let first_match_pair = first_candidate. match_pairs . remove ( 0 ) ;
1485
+ let remaining_match_pairs = mem:: take ( & mut first_candidate. match_pairs ) ;
1487
1486
let remainder_start = self . cfg . start_new_block ( ) ;
1488
1487
// Test the alternatives of this or-pattern.
1489
1488
self . test_or_pattern ( first_candidate, start_block, remainder_start, first_match_pair) ;
@@ -1527,11 +1526,11 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
1527
1526
candidate : & mut Candidate < ' pat , ' tcx > ,
1528
1527
start_block : BasicBlock ,
1529
1528
otherwise_block : BasicBlock ,
1530
- match_pair : & MatchPair < ' pat , ' tcx > ,
1529
+ match_pair : MatchPair < ' pat , ' tcx > ,
1531
1530
) {
1531
+ let or_span = match_pair. pattern . span ;
1532
1532
self . create_or_subcandidates ( candidate, match_pair) ;
1533
1533
let mut or_candidate_refs: Vec < _ > = candidate. subcandidates . iter_mut ( ) . collect ( ) ;
1534
- let or_span = match_pair. pattern . span ;
1535
1534
self . match_candidates (
1536
1535
or_span,
1537
1536
or_span,
@@ -1548,14 +1547,14 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
1548
1547
fn create_or_subcandidates < ' pat > (
1549
1548
& mut self ,
1550
1549
candidate : & mut Candidate < ' pat , ' tcx > ,
1551
- match_pair : & MatchPair < ' pat , ' tcx > ,
1550
+ match_pair : MatchPair < ' pat , ' tcx > ,
1552
1551
) {
1553
- let TestCase :: Or { ref pats } = & match_pair. test_case else { bug ! ( ) } ;
1552
+ let TestCase :: Or { pats } = match_pair. test_case else { bug ! ( ) } ;
1554
1553
debug ! ( "expanding or-pattern: candidate={:#?}\n pats={:#?}" , candidate, pats) ;
1555
1554
candidate. or_span = Some ( match_pair. pattern . span ) ;
1556
1555
candidate. subcandidates = pats
1557
- . iter ( )
1558
- . cloned ( )
1556
+ . into_vec ( )
1557
+ . into_iter ( )
1559
1558
. map ( |flat_pat| Candidate :: from_flat_pat ( flat_pat, candidate. has_guard ) )
1560
1559
. collect ( ) ;
1561
1560
}
@@ -1569,13 +1568,10 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
1569
1568
return ;
1570
1569
}
1571
1570
1572
- let mut can_merge = true ;
1573
- for subcandidate in & mut candidate. subcandidates {
1574
- // FIXME(or_patterns; matthewjasper) Try to be more aggressive here.
1575
- can_merge &=
1576
- subcandidate. subcandidates . is_empty ( ) && subcandidate. extra_data . is_empty ( ) ;
1577
- }
1578
-
1571
+ // FIXME(or_patterns; matthewjasper) Try to be more aggressive here.
1572
+ let can_merge = candidate. subcandidates . iter ( ) . all ( |subcandidate| {
1573
+ subcandidate. subcandidates . is_empty ( ) && subcandidate. extra_data . is_empty ( )
1574
+ } ) ;
1579
1575
if can_merge {
1580
1576
let any_matches = self . cfg . start_new_block ( ) ;
1581
1577
let source_info = self . source_info ( candidate. or_span . unwrap ( ) ) ;
0 commit comments