@@ -1212,35 +1212,38 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
12121212 candidates : & mut [ & mut Candidate < ' _ , ' tcx > ] ,
12131213 fake_borrows : & mut Option < FxIndexSet < Place < ' tcx > > > ,
12141214 ) {
1215- // The candidates are sorted by priority. Check to see whether the
1216- // higher priority candidates (and hence at the front of the slice)
1217- // have satisfied all their match pairs.
1218- let fully_matched = candidates. iter ( ) . take_while ( |c| c. match_pairs . is_empty ( ) ) . count ( ) ;
1219- debug ! ( "match_candidates: {:?} candidates fully matched" , fully_matched) ;
1220- let ( matched_candidates, unmatched_candidates) = candidates. split_at_mut ( fully_matched) ;
1221-
1222- for candidate in matched_candidates. iter_mut ( ) {
1223- start_block = self . select_matched_candidate ( candidate, start_block, fake_borrows) ;
1224- }
1225-
1226- // If there are no candidates that still need testing, we're
1227- // done. Since all matches are exhaustive, execution should
1228- // never reach this point.
1229- if unmatched_candidates. is_empty ( ) {
1230- let source_info = self . source_info ( span) ;
1231- self . cfg . goto ( start_block, source_info, otherwise_block) ;
1232- return ;
1215+ match candidates {
1216+ [ ] => {
1217+ // If there are no candidates that still need testing, we're done. Since all matches are
1218+ // exhaustive, execution should never reach this point.
1219+ let source_info = self . source_info ( span) ;
1220+ self . cfg . goto ( start_block, source_info, otherwise_block) ;
1221+ }
1222+ [ first, remaining @ ..] if first. match_pairs . is_empty ( ) => {
1223+ // The first candidate has satisfied all its match pairs; we link it up and continue
1224+ // with the remaining candidates.
1225+ start_block = self . select_matched_candidate ( first, start_block, fake_borrows) ;
1226+ self . match_simplified_candidates (
1227+ span,
1228+ scrutinee_span,
1229+ start_block,
1230+ otherwise_block,
1231+ remaining,
1232+ fake_borrows,
1233+ )
1234+ }
1235+ candidates => {
1236+ // The first candidate has some unsatisfied match pairs; we proceed to do more tests.
1237+ self . test_candidates_with_or (
1238+ span,
1239+ scrutinee_span,
1240+ candidates,
1241+ start_block,
1242+ otherwise_block,
1243+ fake_borrows,
1244+ ) ;
1245+ }
12331246 }
1234-
1235- // Test for the remaining candidates.
1236- self . test_candidates_with_or (
1237- span,
1238- scrutinee_span,
1239- unmatched_candidates,
1240- start_block,
1241- otherwise_block,
1242- fake_borrows,
1243- ) ;
12441247 }
12451248
12461249 /// Link up matched candidates.
0 commit comments