@@ -148,27 +148,10 @@ impl<'tcx> MirPass<'tcx> for ByMoveBody {
148
148
let Some ( & ( parent_field_idx, parent_capture) ) = parent_captures. peek ( ) else {
149
149
bug ! ( "we ran out of parent captures!" )
150
150
} ;
151
-
152
- let PlaceBase :: Upvar ( parent_base) = parent_capture. place . base else {
153
- bug ! ( "expected capture to be an upvar" ) ;
154
- } ;
155
- let PlaceBase :: Upvar ( child_base) = child_capture. place . base else {
156
- bug ! ( "expected capture to be an upvar" ) ;
157
- } ;
158
-
159
- assert ! (
160
- child_capture. place. projections. len( ) >= parent_capture. place. projections. len( )
161
- ) ;
162
151
// A parent matches a child they share the same prefix of projections.
163
152
// The child may have more, if it is capturing sub-fields out of
164
153
// something that is captured by-move in the parent closure.
165
- if parent_base. var_path . hir_id != child_base. var_path . hir_id
166
- || !std:: iter:: zip (
167
- & child_capture. place . projections ,
168
- & parent_capture. place . projections ,
169
- )
170
- . all ( |( child, parent) | child. kind == parent. kind )
171
- {
154
+ if !child_prefix_matches_parent_projections ( parent_capture, child_capture) {
172
155
// Make sure the field was used at least once.
173
156
assert ! (
174
157
field_used_at_least_once,
@@ -258,6 +241,23 @@ impl<'tcx> MirPass<'tcx> for ByMoveBody {
258
241
}
259
242
}
260
243
244
+ fn child_prefix_matches_parent_projections (
245
+ parent_capture : & ty:: CapturedPlace < ' _ > ,
246
+ child_capture : & ty:: CapturedPlace < ' _ > ,
247
+ ) -> bool {
248
+ let PlaceBase :: Upvar ( parent_base) = parent_capture. place . base else {
249
+ bug ! ( "expected capture to be an upvar" ) ;
250
+ } ;
251
+ let PlaceBase :: Upvar ( child_base) = child_capture. place . base else {
252
+ bug ! ( "expected capture to be an upvar" ) ;
253
+ } ;
254
+
255
+ assert ! ( child_capture. place. projections. len( ) >= parent_capture. place. projections. len( ) ) ;
256
+ parent_base. var_path . hir_id == child_base. var_path . hir_id
257
+ && std:: iter:: zip ( & child_capture. place . projections , & parent_capture. place . projections )
258
+ . all ( |( child, parent) | child. kind == parent. kind )
259
+ }
260
+
261
261
struct MakeByMoveBody < ' tcx > {
262
262
tcx : TyCtxt < ' tcx > ,
263
263
field_remapping : UnordMap < FieldIdx , ( FieldIdx , Ty < ' tcx > , bool , & ' tcx [ Projection < ' tcx > ] ) > ,
0 commit comments