@@ -237,6 +237,9 @@ trait DropTreeBuilder<'tcx> {
237
237
238
238
impl DropTree {
239
239
fn new ( ) -> Self {
240
+ // The root node of the tree doesn't represent a drop, but instead
241
+ // represents the block in the tree that should be jumped to once all
242
+ // of the required drops have been performed.
240
243
let fake_source_info = SourceInfo :: outermost ( DUMMY_SP ) ;
241
244
let fake_data =
242
245
DropData { source_info : fake_source_info, local : Local :: MAX , kind : DropKind :: Storage } ;
@@ -258,6 +261,10 @@ impl DropTree {
258
261
self . entry_points . push ( ( to, from) ) ;
259
262
}
260
263
264
+ /// Builds the MIR for a given drop tree.
265
+ ///
266
+ /// `blocks` should have the same length as `self.drops`, and may have its
267
+ /// first value set to some already existing block.
261
268
fn build_mir < ' tcx , T : DropTreeBuilder < ' tcx > > (
262
269
& mut self ,
263
270
cfg : & mut CFG < ' tcx > ,
@@ -1344,10 +1351,16 @@ impl<'tcx> DropTreeBuilder<'tcx> for GeneratorDrop {
1344
1351
cfg. start_new_block ( )
1345
1352
}
1346
1353
fn add_entry ( cfg : & mut CFG < ' tcx > , from : BasicBlock , to : BasicBlock ) {
1347
- let kind = & mut cfg. block_data_mut ( from) . terminator_mut ( ) . kind ;
1348
- if let TerminatorKind :: Yield { drop, .. } = kind {
1354
+ let term = cfg. block_data_mut ( from) . terminator_mut ( ) ;
1355
+ if let TerminatorKind :: Yield { ref mut drop, .. } = term . kind {
1349
1356
* drop = Some ( to) ;
1350
- } ;
1357
+ } else {
1358
+ span_bug ! (
1359
+ term. source_info. span,
1360
+ "cannot enter generator drop tree from {:?}" ,
1361
+ term. kind
1362
+ )
1363
+ }
1351
1364
}
1352
1365
}
1353
1366
@@ -1358,8 +1371,8 @@ impl<'tcx> DropTreeBuilder<'tcx> for Unwind {
1358
1371
cfg. start_new_cleanup_block ( )
1359
1372
}
1360
1373
fn add_entry ( cfg : & mut CFG < ' tcx > , from : BasicBlock , to : BasicBlock ) {
1361
- let term = & mut cfg. block_data_mut ( from) . terminator_mut ( ) . kind ;
1362
- match term {
1374
+ let term = & mut cfg. block_data_mut ( from) . terminator_mut ( ) ;
1375
+ match & mut term. kind {
1363
1376
TerminatorKind :: Drop { unwind, .. }
1364
1377
| TerminatorKind :: DropAndReplace { unwind, .. }
1365
1378
| TerminatorKind :: FalseUnwind { unwind, .. }
@@ -1375,7 +1388,9 @@ impl<'tcx> DropTreeBuilder<'tcx> for Unwind {
1375
1388
| TerminatorKind :: Unreachable
1376
1389
| TerminatorKind :: Yield { .. }
1377
1390
| TerminatorKind :: GeneratorDrop
1378
- | TerminatorKind :: FalseEdges { .. } => bug ! ( "cannot unwind from {:?}" , term) ,
1391
+ | TerminatorKind :: FalseEdges { .. } => {
1392
+ span_bug ! ( term. source_info. span, "cannot unwind from {:?}" , term. kind)
1393
+ }
1379
1394
}
1380
1395
}
1381
1396
}
0 commit comments