@@ -1272,48 +1272,46 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
1272
1272
start_block : BasicBlock ,
1273
1273
fake_borrows : & mut Option < FxIndexSet < Place < ' tcx > > > ,
1274
1274
) -> BasicBlock {
1275
- debug_assert ! (
1276
- matched_candidates. iter( ) . all( |c| c. subcandidates. is_empty( ) ) ,
1277
- "subcandidates should be empty in select_matched_candidates" ,
1278
- ) ;
1279
-
1280
- // Insert a borrows of prefixes of places that are bound and are
1281
- // behind a dereference projection.
1282
- //
1283
- // These borrows are taken to avoid situations like the following:
1284
- //
1285
- // match x[10] {
1286
- // _ if { x = &[0]; false } => (),
1287
- // y => (), // Out of bounds array access!
1288
- // }
1289
- //
1290
- // match *x {
1291
- // // y is bound by reference in the guard and then by copy in the
1292
- // // arm, so y is 2 in the arm!
1293
- // y if { y == 1 && (x = &2) == () } => y,
1294
- // _ => 3,
1295
- // }
1296
- if let Some ( fake_borrows) = fake_borrows {
1297
- for Binding { source, .. } in
1298
- matched_candidates. iter ( ) . flat_map ( |candidate| & candidate. bindings )
1299
- {
1300
- if let Some ( i) =
1301
- source. projection . iter ( ) . rposition ( |elem| elem == ProjectionElem :: Deref )
1302
- {
1303
- let proj_base = & source. projection [ ..i] ;
1304
-
1305
- fake_borrows. insert ( Place {
1306
- local : source. local ,
1307
- projection : self . tcx . mk_place_elems ( proj_base) ,
1308
- } ) ;
1309
- }
1310
- }
1311
- }
1312
-
1313
1275
let mut next_prebinding = start_block;
1314
1276
for candidate in matched_candidates. iter_mut ( ) {
1315
1277
assert ! ( candidate. otherwise_block. is_none( ) ) ;
1316
1278
assert ! ( candidate. pre_binding_block. is_none( ) ) ;
1279
+ debug_assert ! (
1280
+ candidate. subcandidates. is_empty( ) ,
1281
+ "subcandidates should be empty in select_matched_candidates" ,
1282
+ ) ;
1283
+
1284
+ if let Some ( fake_borrows) = fake_borrows {
1285
+ // Insert a borrows of prefixes of places that are bound and are
1286
+ // behind a dereference projection.
1287
+ //
1288
+ // These borrows are taken to avoid situations like the following:
1289
+ //
1290
+ // match x[10] {
1291
+ // _ if { x = &[0]; false } => (),
1292
+ // y => (), // Out of bounds array access!
1293
+ // }
1294
+ //
1295
+ // match *x {
1296
+ // // y is bound by reference in the guard and then by copy in the
1297
+ // // arm, so y is 2 in the arm!
1298
+ // y if { y == 1 && (x = &2) == () } => y,
1299
+ // _ => 3,
1300
+ // }
1301
+ for Binding { source, .. } in & candidate. bindings {
1302
+ if let Some ( i) =
1303
+ source. projection . iter ( ) . rposition ( |elem| elem == ProjectionElem :: Deref )
1304
+ {
1305
+ let proj_base = & source. projection [ ..i] ;
1306
+
1307
+ fake_borrows. insert ( Place {
1308
+ local : source. local ,
1309
+ projection : self . tcx . mk_place_elems ( proj_base) ,
1310
+ } ) ;
1311
+ }
1312
+ }
1313
+ }
1314
+
1317
1315
candidate. pre_binding_block = Some ( next_prebinding) ;
1318
1316
next_prebinding = self . cfg . start_new_block ( ) ;
1319
1317
if candidate. has_guard {
0 commit comments