@@ -609,6 +609,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
609609
610610 // `static |_task_context| -> <ret_ty> { body }`:
611611 let generator_kind = hir:: ExprKind :: Closure {
612+ binder : & hir:: ClosureBinder :: Default ,
612613 capture_clause,
613614 bound_generic_params : & [ ] ,
614615 fn_decl,
@@ -842,15 +843,9 @@ impl<'hir> LoweringContext<'_, 'hir> {
842843 body : & Expr ,
843844 fn_decl_span : Span ,
844845 ) -> hir:: ExprKind < ' hir > {
845- // FIXME(waffle): lower binder
846- if let & ClosureBinder :: For { span, .. } = binder {
847- self . sess
848- . struct_span_err ( span, "`for<...>` binders for closures are not yet supported" )
849- . help ( "consider removing `for<...>`" )
850- . emit ( ) ;
851- }
846+ let ( binder_clause, generic_params) = self . lower_closure_binder ( binder) ;
852847
853- let ( body , generator_option) = self . with_new_scopes ( move |this| {
848+ let ( body_id , generator_option) = self . with_new_scopes ( move |this| {
854849 let prev = this. current_item ;
855850 this. current_item = Some ( fn_decl_span) ;
856851 let mut generator_kind = None ;
@@ -865,15 +860,16 @@ impl<'hir> LoweringContext<'_, 'hir> {
865860 ( body_id, generator_option)
866861 } ) ;
867862
868- self . with_lifetime_binder ( closure_id, & [ ] , |this, bound_generic_params| {
863+ self . with_lifetime_binder ( closure_id, generic_params , |this, bound_generic_params| {
869864 // Lower outside new scope to preserve `is_in_loop_condition`.
870865 let fn_decl = this. lower_fn_decl ( decl, None , FnDeclKind :: Closure , None ) ;
871866
872867 hir:: ExprKind :: Closure {
868+ binder : binder_clause,
873869 capture_clause,
874870 bound_generic_params,
875871 fn_decl,
876- body,
872+ body : body_id ,
877873 fn_decl_span : this. lower_span ( fn_decl_span) ,
878874 movability : generator_option,
879875 }
@@ -918,6 +914,21 @@ impl<'hir> LoweringContext<'_, 'hir> {
918914 }
919915 }
920916
917+ fn lower_closure_binder < ' c > (
918+ & mut self ,
919+ binder : & ' c ClosureBinder ,
920+ ) -> ( & ' hir hir:: ClosureBinder , & ' c [ GenericParam ] ) {
921+ let ( binder, params) = match binder {
922+ ClosureBinder :: NotPresent => ( hir:: ClosureBinder :: Default , & [ ] [ ..] ) ,
923+ & ClosureBinder :: For { span, ref generic_params } => {
924+ let span = self . lower_span ( span) ;
925+ ( hir:: ClosureBinder :: For { span } , & * * generic_params)
926+ }
927+ } ;
928+
929+ ( self . arena . alloc ( binder) , params)
930+ }
931+
921932 fn lower_expr_async_closure (
922933 & mut self ,
923934 binder : & ClosureBinder ,
@@ -928,17 +939,15 @@ impl<'hir> LoweringContext<'_, 'hir> {
928939 body : & Expr ,
929940 fn_decl_span : Span ,
930941 ) -> hir:: ExprKind < ' hir > {
931- // FIXME(waffle): lower binder
932942 if let & ClosureBinder :: For { span, .. } = binder {
933- self . sess
934- . struct_span_err (
935- span,
936- "`for<...>` binders for async closures are not yet supported" ,
937- )
938- . help ( "consider removing `for<...>`" )
939- . emit ( ) ;
943+ self . tcx . sess . span_err (
944+ span,
945+ "`for<...>` binders on `async` closures are not currently supported" ,
946+ ) ;
940947 }
941948
949+ let ( binder_clause, generic_params) = self . lower_closure_binder ( binder) ;
950+
942951 let outer_decl =
943952 FnDecl { inputs : decl. inputs . clone ( ) , output : FnRetTy :: Default ( fn_decl_span) } ;
944953
@@ -976,13 +985,14 @@ impl<'hir> LoweringContext<'_, 'hir> {
976985 body_id
977986 } ) ;
978987
979- self . with_lifetime_binder ( closure_id, & [ ] , |this, bound_generic_params| {
988+ self . with_lifetime_binder ( closure_id, generic_params , |this, bound_generic_params| {
980989 // We need to lower the declaration outside the new scope, because we
981990 // have to conserve the state of being inside a loop condition for the
982991 // closure argument types.
983992 let fn_decl = this. lower_fn_decl ( & outer_decl, None , FnDeclKind :: Closure , None ) ;
984993
985994 hir:: ExprKind :: Closure {
995+ binder : binder_clause,
986996 capture_clause,
987997 bound_generic_params,
988998 fn_decl,
0 commit comments