@@ -1283,7 +1283,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
1283
1283
//
1284
1284
// only generates a single switch.
1285
1285
let match_pair = candidate. match_pairs . pop ( ) . unwrap ( ) ;
1286
- self . create_or_subcandidates ( candidate, & match_pair) ;
1286
+ self . create_or_subcandidates ( candidate, match_pair) ;
1287
1287
split_or_candidate = true ;
1288
1288
}
1289
1289
}
@@ -1471,9 +1471,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
1471
1471
return ;
1472
1472
}
1473
1473
1474
- let match_pairs = mem:: take ( & mut first_candidate. match_pairs ) ;
1475
- let ( first_match_pair, remaining_match_pairs) = match_pairs. split_first ( ) . unwrap ( ) ;
1476
-
1474
+ let first_match_pair = first_candidate. match_pairs . remove ( 0 ) ;
1475
+ let remaining_match_pairs = mem:: take ( & mut first_candidate. match_pairs ) ;
1477
1476
let remainder_start = self . cfg . start_new_block ( ) ;
1478
1477
// Test the alternatives of this or-pattern.
1479
1478
self . test_or_pattern ( first_candidate, start_block, remainder_start, first_match_pair) ;
@@ -1517,11 +1516,11 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
1517
1516
candidate : & mut Candidate < ' pat , ' tcx > ,
1518
1517
start_block : BasicBlock ,
1519
1518
otherwise_block : BasicBlock ,
1520
- match_pair : & MatchPair < ' pat , ' tcx > ,
1519
+ match_pair : MatchPair < ' pat , ' tcx > ,
1521
1520
) {
1521
+ let or_span = match_pair. pattern . span ;
1522
1522
self . create_or_subcandidates ( candidate, match_pair) ;
1523
1523
let mut or_candidate_refs: Vec < _ > = candidate. subcandidates . iter_mut ( ) . collect ( ) ;
1524
- let or_span = match_pair. pattern . span ;
1525
1524
self . match_candidates (
1526
1525
or_span,
1527
1526
or_span,
@@ -1538,14 +1537,14 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
1538
1537
fn create_or_subcandidates < ' pat > (
1539
1538
& mut self ,
1540
1539
candidate : & mut Candidate < ' pat , ' tcx > ,
1541
- match_pair : & MatchPair < ' pat , ' tcx > ,
1540
+ match_pair : MatchPair < ' pat , ' tcx > ,
1542
1541
) {
1543
- let TestCase :: Or { ref pats } = & match_pair. test_case else { bug ! ( ) } ;
1542
+ let TestCase :: Or { pats } = match_pair. test_case else { bug ! ( ) } ;
1544
1543
debug ! ( "expanding or-pattern: candidate={:#?}\n pats={:#?}" , candidate, pats) ;
1545
1544
candidate. or_span = Some ( match_pair. pattern . span ) ;
1546
1545
candidate. subcandidates = pats
1547
- . iter ( )
1548
- . cloned ( )
1546
+ . into_vec ( )
1547
+ . into_iter ( )
1549
1548
. map ( |flat_pat| Candidate :: from_flat_pat ( flat_pat, candidate. has_guard ) )
1550
1549
. collect ( ) ;
1551
1550
}
@@ -1559,13 +1558,10 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
1559
1558
return ;
1560
1559
}
1561
1560
1562
- let mut can_merge = true ;
1563
- for subcandidate in & mut candidate. subcandidates {
1564
- // FIXME(or_patterns; matthewjasper) Try to be more aggressive here.
1565
- can_merge &=
1566
- subcandidate. subcandidates . is_empty ( ) && subcandidate. extra_data . is_empty ( ) ;
1567
- }
1568
-
1561
+ // FIXME(or_patterns; matthewjasper) Try to be more aggressive here.
1562
+ let can_merge = candidate. subcandidates . iter ( ) . all ( |subcandidate| {
1563
+ subcandidate. subcandidates . is_empty ( ) && subcandidate. extra_data . is_empty ( )
1564
+ } ) ;
1569
1565
if can_merge {
1570
1566
let any_matches = self . cfg . start_new_block ( ) ;
1571
1567
let or_span = candidate. or_span . take ( ) . unwrap ( ) ;
0 commit comments