@@ -609,6 +609,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
609
609
610
610
// `static |_task_context| -> <ret_ty> { body }`:
611
611
let generator_kind = hir:: ExprKind :: Closure {
612
+ binder : & hir:: ClosureBinder :: Default ,
612
613
capture_clause,
613
614
bound_generic_params : & [ ] ,
614
615
fn_decl,
@@ -842,15 +843,9 @@ impl<'hir> LoweringContext<'_, 'hir> {
842
843
body : & Expr ,
843
844
fn_decl_span : Span ,
844
845
) -> 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) ;
852
847
853
- let ( body , generator_option) = self . with_new_scopes ( move |this| {
848
+ let ( body_id , generator_option) = self . with_new_scopes ( move |this| {
854
849
let prev = this. current_item ;
855
850
this. current_item = Some ( fn_decl_span) ;
856
851
let mut generator_kind = None ;
@@ -865,15 +860,16 @@ impl<'hir> LoweringContext<'_, 'hir> {
865
860
( body_id, generator_option)
866
861
} ) ;
867
862
868
- self . with_lifetime_binder ( closure_id, & [ ] , |this, bound_generic_params| {
863
+ self . with_lifetime_binder ( closure_id, generic_params , |this, bound_generic_params| {
869
864
// Lower outside new scope to preserve `is_in_loop_condition`.
870
865
let fn_decl = this. lower_fn_decl ( decl, None , FnDeclKind :: Closure , None ) ;
871
866
872
867
hir:: ExprKind :: Closure {
868
+ binder : binder_clause,
873
869
capture_clause,
874
870
bound_generic_params,
875
871
fn_decl,
876
- body,
872
+ body : body_id ,
877
873
fn_decl_span : this. lower_span ( fn_decl_span) ,
878
874
movability : generator_option,
879
875
}
@@ -918,6 +914,21 @@ impl<'hir> LoweringContext<'_, 'hir> {
918
914
}
919
915
}
920
916
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
+
921
932
fn lower_expr_async_closure (
922
933
& mut self ,
923
934
binder : & ClosureBinder ,
@@ -928,17 +939,15 @@ impl<'hir> LoweringContext<'_, 'hir> {
928
939
body : & Expr ,
929
940
fn_decl_span : Span ,
930
941
) -> hir:: ExprKind < ' hir > {
931
- // FIXME(waffle): lower binder
932
942
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
+ ) ;
940
947
}
941
948
949
+ let ( binder_clause, generic_params) = self . lower_closure_binder ( binder) ;
950
+
942
951
let outer_decl =
943
952
FnDecl { inputs : decl. inputs . clone ( ) , output : FnRetTy :: Default ( fn_decl_span) } ;
944
953
@@ -976,13 +985,14 @@ impl<'hir> LoweringContext<'_, 'hir> {
976
985
body_id
977
986
} ) ;
978
987
979
- self . with_lifetime_binder ( closure_id, & [ ] , |this, bound_generic_params| {
988
+ self . with_lifetime_binder ( closure_id, generic_params , |this, bound_generic_params| {
980
989
// We need to lower the declaration outside the new scope, because we
981
990
// have to conserve the state of being inside a loop condition for the
982
991
// closure argument types.
983
992
let fn_decl = this. lower_fn_decl ( & outer_decl, None , FnDeclKind :: Closure , None ) ;
984
993
985
994
hir:: ExprKind :: Closure {
995
+ binder : binder_clause,
986
996
capture_clause,
987
997
bound_generic_params,
988
998
fn_decl,
0 commit comments