@@ -735,53 +735,53 @@ fn locals_live_across_suspend_points<'tcx>(
735735 let mut live_locals_at_any_suspension_point = DenseBitSet :: new_empty ( body. local_decls . len ( ) ) ;
736736
737737 for ( block, data) in body. basic_blocks . iter_enumerated ( ) {
738- if let TerminatorKind :: Yield { .. } = data. terminator ( ) . kind {
739- let loc = Location { block, statement_index : data. statements . len ( ) } ;
740-
741- liveness. seek_to_block_end ( block) ;
742- let mut live_locals = liveness. get ( ) . clone ( ) ;
743-
744- if !movable {
745- // The `liveness` variable contains the liveness of MIR locals ignoring borrows.
746- // This is correct for movable coroutines since borrows cannot live across
747- // suspension points. However for immovable coroutines we need to account for
748- // borrows, so we conservatively assume that all borrowed locals are live until
749- // we find a StorageDead statement referencing the locals.
750- // To do this we just union our `liveness` result with `borrowed_locals`, which
751- // contains all the locals which has been borrowed before this suspension point.
752- // If a borrow is converted to a raw reference, we must also assume that it lives
753- // forever. Note that the final liveness is still bounded by the storage liveness
754- // of the local, which happens using the `intersect` operation below.
755- borrowed_locals_cursor2. seek_before_primary_effect ( loc) ;
756- live_locals. union ( borrowed_locals_cursor2. get ( ) ) ;
757- }
738+ let TerminatorKind :: Yield { .. } = data. terminator ( ) . kind else { continue } ;
739+
740+ let loc = Location { block, statement_index : data. statements . len ( ) } ;
741+
742+ liveness. seek_to_block_end ( block) ;
743+ let mut live_locals = liveness. get ( ) . clone ( ) ;
744+
745+ if !movable {
746+ // The `liveness` variable contains the liveness of MIR locals ignoring borrows.
747+ // This is correct for movable coroutines since borrows cannot live across
748+ // suspension points. However for immovable coroutines we need to account for
749+ // borrows, so we conservatively assume that all borrowed locals are live until
750+ // we find a StorageDead statement referencing the locals.
751+ // To do this we just union our `liveness` result with `borrowed_locals`, which
752+ // contains all the locals which has been borrowed before this suspension point.
753+ // If a borrow is converted to a raw reference, we must also assume that it lives
754+ // forever. Note that the final liveness is still bounded by the storage liveness
755+ // of the local, which happens using the `intersect` operation below.
756+ borrowed_locals_cursor2. seek_before_primary_effect ( loc) ;
757+ live_locals. union ( borrowed_locals_cursor2. get ( ) ) ;
758+ }
758759
759- // Store the storage liveness for later use so we can restore the state
760- // after a suspension point
761- storage_live. seek_before_primary_effect ( loc) ;
762- storage_liveness_map[ block] = Some ( storage_live. get ( ) . clone ( ) ) ;
760+ // Store the storage liveness for later use so we can restore the state
761+ // after a suspension point
762+ storage_live. seek_before_primary_effect ( loc) ;
763+ storage_liveness_map[ block] = Some ( storage_live. get ( ) . clone ( ) ) ;
763764
764- // Locals live are live at this point only if they are used across
765- // suspension points (the `liveness` variable)
766- // and their storage is required (the `storage_required` variable)
767- requires_storage_cursor. seek_before_primary_effect ( loc) ;
768- live_locals. intersect ( requires_storage_cursor. get ( ) ) ;
765+ // Locals live are live at this point only if they are used across
766+ // suspension points (the `liveness` variable)
767+ // and their storage is required (the `storage_required` variable)
768+ requires_storage_cursor. seek_before_primary_effect ( loc) ;
769+ live_locals. intersect ( requires_storage_cursor. get ( ) ) ;
769770
770- // The coroutine argument is ignored.
771- live_locals. remove ( SELF_ARG ) ;
771+ // The coroutine argument is ignored.
772+ live_locals. remove ( SELF_ARG ) ;
772773
773- debug ! ( "loc = {:?}, live_locals = {:?}" , loc, live_locals) ;
774+ debug ! ( ? loc, ? live_locals) ;
774775
775- // Add the locals live at this suspension point to the set of locals which live across
776- // any suspension points
777- live_locals_at_any_suspension_point. union ( & live_locals) ;
776+ // Add the locals live at this suspension point to the set of locals which live across
777+ // any suspension points
778+ live_locals_at_any_suspension_point. union ( & live_locals) ;
778779
779- live_locals_at_suspension_points. push ( live_locals) ;
780- source_info_at_suspension_points. push ( data. terminator ( ) . source_info ) ;
781- }
780+ live_locals_at_suspension_points. push ( live_locals) ;
781+ source_info_at_suspension_points. push ( data. terminator ( ) . source_info ) ;
782782 }
783783
784- debug ! ( "live_locals_anywhere = {:?}" , live_locals_at_any_suspension_point) ;
784+ debug ! ( ? live_locals_at_any_suspension_point) ;
785785 let saved_locals = CoroutineSavedLocals ( live_locals_at_any_suspension_point) ;
786786
787787 // Renumber our liveness_map bitsets to include only the locals we are
0 commit comments