@@ -776,10 +776,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
776776 body : & Expr ,
777777 fn_decl_span : Span ,
778778 ) -> hir:: ExprKind < ' hir > {
779- // Lower outside new scope to preserve `is_in_loop_condition`.
780- let fn_decl = self . lower_fn_decl ( decl, None , false , None ) ;
781-
782- self . with_new_scopes ( move |this| {
779+ let ( body_id, generator_option) = self . with_new_scopes ( move |this| {
783780 let prev = this. current_item ;
784781 this. current_item = Some ( fn_decl_span) ;
785782 let mut generator_kind = None ;
@@ -791,8 +788,13 @@ impl<'hir> LoweringContext<'_, 'hir> {
791788 let generator_option =
792789 this. generator_movability_for_fn ( & decl, fn_decl_span, generator_kind, movability) ;
793790 this. current_item = prev;
794- hir:: ExprKind :: Closure ( capture_clause, fn_decl, body_id, fn_decl_span, generator_option)
795- } )
791+ ( body_id, generator_option)
792+ } ) ;
793+
794+ // Lower outside new scope to preserve `is_in_loop_condition`.
795+ let fn_decl = self . lower_fn_decl ( decl, None , false , None ) ;
796+
797+ hir:: ExprKind :: Closure ( capture_clause, fn_decl, body_id, fn_decl_span, generator_option)
796798 }
797799
798800 fn generator_movability_for_fn (
@@ -838,12 +840,8 @@ impl<'hir> LoweringContext<'_, 'hir> {
838840 ) -> hir:: ExprKind < ' hir > {
839841 let outer_decl =
840842 FnDecl { inputs : decl. inputs . clone ( ) , output : FnRetTy :: Default ( fn_decl_span) } ;
841- // We need to lower the declaration outside the new scope, because we
842- // have to conserve the state of being inside a loop condition for the
843- // closure argument types.
844- let fn_decl = self . lower_fn_decl ( & outer_decl, None , false , None ) ;
845843
846- self . with_new_scopes ( move |this| {
844+ let body_id = self . with_new_scopes ( |this| {
847845 // FIXME(cramertj): allow `async` non-`move` closures with arguments.
848846 if capture_clause == CaptureBy :: Ref && !decl. inputs . is_empty ( ) {
849847 struct_span_err ! (
@@ -874,8 +872,15 @@ impl<'hir> LoweringContext<'_, 'hir> {
874872 ) ;
875873 this. expr ( fn_decl_span, async_body, ThinVec :: new ( ) )
876874 } ) ;
877- hir:: ExprKind :: Closure ( capture_clause, fn_decl, body_id, fn_decl_span, None )
878- } )
875+ body_id
876+ } ) ;
877+
878+ // We need to lower the declaration outside the new scope, because we
879+ // have to conserve the state of being inside a loop condition for the
880+ // closure argument types.
881+ let fn_decl = self . lower_fn_decl ( & outer_decl, None , false , None ) ;
882+
883+ hir:: ExprKind :: Closure ( capture_clause, fn_decl, body_id, fn_decl_span, None )
879884 }
880885
881886 /// Destructure the LHS of complex assignments.
0 commit comments