@@ -770,10 +770,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
770770 body : & Expr ,
771771 fn_decl_span : Span ,
772772 ) -> hir:: ExprKind < ' hir > {
773- // Lower outside new scope to preserve `is_in_loop_condition`.
774- let fn_decl = self . lower_fn_decl ( decl, None , false , None ) ;
775-
776- self . with_new_scopes ( move |this| {
773+ let ( body_id, generator_option) = self . with_new_scopes ( move |this| {
777774 let prev = this. current_item ;
778775 this. current_item = Some ( fn_decl_span) ;
779776 let mut generator_kind = None ;
@@ -785,8 +782,13 @@ impl<'hir> LoweringContext<'_, 'hir> {
785782 let generator_option =
786783 this. generator_movability_for_fn ( & decl, fn_decl_span, generator_kind, movability) ;
787784 this. current_item = prev;
788- hir:: ExprKind :: Closure ( capture_clause, fn_decl, body_id, fn_decl_span, generator_option)
789- } )
785+ ( body_id, generator_option)
786+ } ) ;
787+
788+ // Lower outside new scope to preserve `is_in_loop_condition`.
789+ let fn_decl = self . lower_fn_decl ( decl, None , false , None ) ;
790+
791+ hir:: ExprKind :: Closure ( capture_clause, fn_decl, body_id, fn_decl_span, generator_option)
790792 }
791793
792794 fn generator_movability_for_fn (
@@ -832,12 +834,8 @@ impl<'hir> LoweringContext<'_, 'hir> {
832834 ) -> hir:: ExprKind < ' hir > {
833835 let outer_decl =
834836 FnDecl { inputs : decl. inputs . clone ( ) , output : FnRetTy :: Default ( fn_decl_span) } ;
835- // We need to lower the declaration outside the new scope, because we
836- // have to conserve the state of being inside a loop condition for the
837- // closure argument types.
838- let fn_decl = self . lower_fn_decl ( & outer_decl, None , false , None ) ;
839837
840- self . with_new_scopes ( move |this| {
838+ let body_id = self . with_new_scopes ( |this| {
841839 // FIXME(cramertj): allow `async` non-`move` closures with arguments.
842840 if capture_clause == CaptureBy :: Ref && !decl. inputs . is_empty ( ) {
843841 struct_span_err ! (
@@ -868,8 +866,15 @@ impl<'hir> LoweringContext<'_, 'hir> {
868866 ) ;
869867 this. expr ( fn_decl_span, async_body, ThinVec :: new ( ) )
870868 } ) ;
871- hir:: ExprKind :: Closure ( capture_clause, fn_decl, body_id, fn_decl_span, None )
872- } )
869+ body_id
870+ } ) ;
871+
872+ // We need to lower the declaration outside the new scope, because we
873+ // have to conserve the state of being inside a loop condition for the
874+ // closure argument types.
875+ let fn_decl = self . lower_fn_decl ( & outer_decl, None , false , None ) ;
876+
877+ hir:: ExprKind :: Closure ( capture_clause, fn_decl, body_id, fn_decl_span, None )
873878 }
874879
875880 /// Destructure the LHS of complex assignments.
0 commit comments