@@ -144,67 +144,67 @@ impl<'tcx> MirPass<'tcx> for ByMoveBody {
144
144
. skip ( num_args)
145
145
. enumerate ( )
146
146
{
147
+ let ( mut parent_field_idx, mut parent_capture) ;
147
148
loop {
148
- let & ( parent_field_idx, parent_capture) =
149
- parent_captures. peek ( ) . expect ( "we ran out of parent captures!" ) ;
149
+ ( parent_field_idx, parent_capture) =
150
+ * parent_captures. peek ( ) . expect ( "we ran out of parent captures!" ) ;
150
151
// A parent matches a child they share the same prefix of projections.
151
152
// The child may have more, if it is capturing sub-fields out of
152
153
// something that is captured by-move in the parent closure.
153
- if !child_prefix_matches_parent_projections ( parent_capture, child_capture) {
154
- // Make sure the field was used at least once.
155
- assert ! (
156
- field_used_at_least_once,
157
- "we captured {parent_capture:#?} but it was not used in the child coroutine?"
158
- ) ;
159
- field_used_at_least_once = false ;
160
- // Skip this field.
161
- let _ = parent_captures. next ( ) . unwrap ( ) ;
162
- continue ;
154
+ if child_prefix_matches_parent_projections ( parent_capture, child_capture) {
155
+ break ;
163
156
}
157
+ // Make sure the field was used at least once.
158
+ assert ! (
159
+ field_used_at_least_once,
160
+ "we captured {parent_capture:#?} but it was not used in the child coroutine?"
161
+ ) ;
162
+ field_used_at_least_once = false ;
163
+ // Skip this field.
164
+ let _ = parent_captures. next ( ) . unwrap ( ) ;
165
+ }
164
166
165
- // Store this set of additional projections (fields and derefs).
166
- // We need to re-apply them later.
167
- let child_precise_captures =
168
- & child_capture. place . projections [ parent_capture. place . projections . len ( ) ..] ;
167
+ // Store this set of additional projections (fields and derefs).
168
+ // We need to re-apply them later.
169
+ let child_precise_captures =
170
+ & child_capture. place . projections [ parent_capture. place . projections . len ( ) ..] ;
169
171
170
- // If the parent captures by-move, and the child captures by-ref, then we
171
- // need to peel an additional `deref` off of the body of the child.
172
- let needs_deref = child_capture. is_by_ref ( ) && !parent_capture. is_by_ref ( ) ;
173
- if needs_deref {
174
- assert_ne ! (
175
- coroutine_kind,
176
- ty:: ClosureKind :: FnOnce ,
177
- "`FnOnce` coroutine-closures return coroutines that capture from \
172
+ // If the parent captures by-move, and the child captures by-ref, then we
173
+ // need to peel an additional `deref` off of the body of the child.
174
+ let needs_deref = child_capture. is_by_ref ( ) && !parent_capture. is_by_ref ( ) ;
175
+ if needs_deref {
176
+ assert_ne ! (
177
+ coroutine_kind,
178
+ ty:: ClosureKind :: FnOnce ,
179
+ "`FnOnce` coroutine-closures return coroutines that capture from \
178
180
their body; it will always result in a borrowck error!"
179
- ) ;
180
- }
181
+ ) ;
182
+ }
181
183
182
- // Finally, store the type of the parent's captured place. We need
183
- // this when building the field projection in the MIR body later on.
184
- let mut parent_capture_ty = parent_capture. place . ty ( ) ;
185
- parent_capture_ty = match parent_capture. info . capture_kind {
186
- ty:: UpvarCapture :: ByValue => parent_capture_ty,
187
- ty:: UpvarCapture :: ByRef ( kind) => Ty :: new_ref (
188
- tcx,
189
- tcx. lifetimes . re_erased ,
190
- parent_capture_ty,
191
- kind. to_mutbl_lossy ( ) ,
192
- ) ,
193
- } ;
184
+ // Finally, store the type of the parent's captured place. We need
185
+ // this when building the field projection in the MIR body later on.
186
+ let mut parent_capture_ty = parent_capture. place . ty ( ) ;
187
+ parent_capture_ty = match parent_capture. info . capture_kind {
188
+ ty:: UpvarCapture :: ByValue => parent_capture_ty,
189
+ ty:: UpvarCapture :: ByRef ( kind) => Ty :: new_ref (
190
+ tcx,
191
+ tcx. lifetimes . re_erased ,
192
+ parent_capture_ty,
193
+ kind. to_mutbl_lossy ( ) ,
194
+ ) ,
195
+ } ;
194
196
195
- field_remapping. insert (
196
- FieldIdx :: from_usize ( child_field_idx + num_args) ,
197
- (
198
- FieldIdx :: from_usize ( parent_field_idx + num_args) ,
199
- parent_capture_ty,
200
- needs_deref,
201
- child_precise_captures,
202
- ) ,
203
- ) ;
197
+ field_remapping. insert (
198
+ FieldIdx :: from_usize ( child_field_idx + num_args) ,
199
+ (
200
+ FieldIdx :: from_usize ( parent_field_idx + num_args) ,
201
+ parent_capture_ty,
202
+ needs_deref,
203
+ child_precise_captures,
204
+ ) ,
205
+ ) ;
204
206
205
- field_used_at_least_once = true ;
206
- break ;
207
- }
207
+ field_used_at_least_once = true ;
208
208
}
209
209
210
210
// Pop the last parent capture
0 commit comments