@@ -1251,7 +1251,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
1251
1251
//
1252
1252
// only generates a single switch.
1253
1253
let match_pair = candidate. match_pairs . pop ( ) . unwrap ( ) ;
1254
- self . create_or_subcandidates ( candidate, & match_pair) ;
1254
+ self . create_or_subcandidates ( candidate, match_pair) ;
1255
1255
split_or_candidate = true ;
1256
1256
}
1257
1257
}
@@ -1439,9 +1439,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
1439
1439
return ;
1440
1440
}
1441
1441
1442
- let match_pairs = mem:: take ( & mut first_candidate. match_pairs ) ;
1443
- let ( first_match_pair, remaining_match_pairs) = match_pairs. split_first ( ) . unwrap ( ) ;
1444
-
1442
+ let first_match_pair = first_candidate. match_pairs . remove ( 0 ) ;
1443
+ let remaining_match_pairs = mem:: take ( & mut first_candidate. match_pairs ) ;
1445
1444
let remainder_start = self . cfg . start_new_block ( ) ;
1446
1445
// Test the alternatives of this or-pattern.
1447
1446
self . test_or_pattern ( first_candidate, start_block, remainder_start, first_match_pair) ;
@@ -1485,11 +1484,11 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
1485
1484
candidate : & mut Candidate < ' pat , ' tcx > ,
1486
1485
start_block : BasicBlock ,
1487
1486
otherwise_block : BasicBlock ,
1488
- match_pair : & MatchPair < ' pat , ' tcx > ,
1487
+ match_pair : MatchPair < ' pat , ' tcx > ,
1489
1488
) {
1489
+ let or_span = match_pair. pattern . span ;
1490
1490
self . create_or_subcandidates ( candidate, match_pair) ;
1491
1491
let mut or_candidate_refs: Vec < _ > = candidate. subcandidates . iter_mut ( ) . collect ( ) ;
1492
- let or_span = match_pair. pattern . span ;
1493
1492
self . match_candidates (
1494
1493
or_span,
1495
1494
or_span,
@@ -1506,14 +1505,14 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
1506
1505
fn create_or_subcandidates < ' pat > (
1507
1506
& mut self ,
1508
1507
candidate : & mut Candidate < ' pat , ' tcx > ,
1509
- match_pair : & MatchPair < ' pat , ' tcx > ,
1508
+ match_pair : MatchPair < ' pat , ' tcx > ,
1510
1509
) {
1511
- let TestCase :: Or { ref pats } = & match_pair. test_case else { bug ! ( ) } ;
1510
+ let TestCase :: Or { pats } = match_pair. test_case else { bug ! ( ) } ;
1512
1511
debug ! ( "expanding or-pattern: candidate={:#?}\n pats={:#?}" , candidate, pats) ;
1513
1512
candidate. or_span = Some ( match_pair. pattern . span ) ;
1514
1513
candidate. subcandidates = pats
1515
- . iter ( )
1516
- . cloned ( )
1514
+ . into_vec ( )
1515
+ . into_iter ( )
1517
1516
. map ( |flat_pat| Candidate :: from_flat_pat ( flat_pat, candidate. has_guard ) )
1518
1517
. collect ( ) ;
1519
1518
}
@@ -1527,13 +1526,10 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
1527
1526
return ;
1528
1527
}
1529
1528
1530
- let mut can_merge = true ;
1531
- for subcandidate in & mut candidate. subcandidates {
1532
- // FIXME(or_patterns; matthewjasper) Try to be more aggressive here.
1533
- can_merge &=
1534
- subcandidate. subcandidates . is_empty ( ) && subcandidate. extra_data . is_empty ( ) ;
1535
- }
1536
-
1529
+ // FIXME(or_patterns; matthewjasper) Try to be more aggressive here.
1530
+ let can_merge = candidate. subcandidates . iter ( ) . all ( |subcandidate| {
1531
+ subcandidate. subcandidates . is_empty ( ) && subcandidate. extra_data . is_empty ( )
1532
+ } ) ;
1537
1533
if can_merge {
1538
1534
let any_matches = self . cfg . start_new_block ( ) ;
1539
1535
let source_info = self . source_info ( candidate. or_span . unwrap ( ) ) ;
0 commit comments