@@ -1058,17 +1058,12 @@ fn build_async_destructor_ctor_shim<'tcx>(
10581058 def_id : DefId ,
10591059 self_ty : Ty < ' tcx > ,
10601060) -> Body < ' tcx > {
1061- // FIXME: implement cleanup branches
1062-
1063- let span = tcx. def_span ( def_id) ;
1064- let Some ( sig) = tcx. fn_sig ( def_id) . instantiate ( tcx, & [ self_ty. into ( ) ] ) . no_bound_vars ( ) else {
1065- span_bug ! ( span, "async_drop_in_place_raw with bound vars for `{self_ty}`" ) ;
1066- } ;
1061+ let mut builder = AsyncDestructorCtorShimBuilder :: new ( tcx, def_id, self_ty) ;
10671062
1063+ let source_info = builder. source_info ;
1064+ let span = builder. span ;
10681065 let param_env = tcx. param_env_reveal_all_normalized ( def_id) ;
1069- let source_info = SourceInfo :: outermost ( span) ;
10701066
1071- let mut locals = local_decls_for_sig ( & sig, span) ;
10721067 let return_local = Local :: new ( 0 ) ;
10731068 let self_ptr = Local :: new ( 1 ) ;
10741069
@@ -1174,39 +1169,18 @@ fn build_async_destructor_ctor_shim<'tcx>(
11741169 } ;
11751170
11761171 let return_bb;
1177- let mut blocks;
1172+ let mut blocks = & mut builder . bbs ;
11781173 match strategy {
11791174 GlueStrategy :: Empty => {
1180- let ready_unit_fn = tcx. require_lang_item ( LangItem :: FutureReadyUnitCtor , Some ( span) ) ;
1181-
1182- blocks = IndexVec :: from_elem_n ( BasicBlockData :: new ( None ) , 2 ) ;
1183- let ready_unit_bb = BasicBlock :: new ( 0 ) ;
1184- return_bb = BasicBlock :: new ( 1 ) ;
1185-
1186- blocks[ ready_unit_bb] . terminator = Some ( Terminator {
1187- source_info,
1188- kind : TerminatorKind :: Call {
1189- func : Operand :: function_handle (
1190- tcx,
1191- ready_unit_fn,
1192- [ /* HOST */ tcx. consts . false_ . into ( ) ] ,
1193- span,
1194- ) ,
1195- args : Vec :: new ( ) ,
1196- destination : return_local. into ( ) ,
1197- target : Some ( return_bb) ,
1198- unwind : UnwindAction :: Continue ,
1199- call_source : CallSource :: Misc ,
1200- fn_span : span,
1201- } ,
1202- } ) ;
1175+ builder. ready_unit ( ) ;
1176+ return builder. return_ ( ) ;
12031177 }
12041178
12051179 GlueStrategy :: AsyncDropProjection => {
12061180 let surface_async_drop_in_place_fn =
12071181 tcx. require_lang_item ( LangItem :: SurfaceAsyncDropInPlace , Some ( span) ) ;
12081182
1209- blocks = IndexVec :: from_elem_n ( BasicBlockData :: new ( None ) , 2 ) ;
1183+ * blocks = IndexVec :: from_elem_n ( BasicBlockData :: new ( None ) , 2 ) ;
12101184 let surface_async_drop_in_place_bb = BasicBlock :: new ( 0 ) ;
12111185 return_bb = BasicBlock :: new ( 1 ) ;
12121186
@@ -1216,7 +1190,7 @@ fn build_async_destructor_ctor_shim<'tcx>(
12161190 func : Operand :: function_handle (
12171191 tcx,
12181192 surface_async_drop_in_place_fn,
1219- [ self_ty. into ( ) ] ,
1193+ iter :: once ( self_ty. into ( ) ) ,
12201194 span,
12211195 ) ,
12221196 args : vec ! [ respan( span, Operand :: Move ( self_ptr. into( ) ) ) ] ,
@@ -1233,13 +1207,14 @@ fn build_async_destructor_ctor_shim<'tcx>(
12331207 let slice_async_destructor_fn =
12341208 tcx. require_lang_item ( LangItem :: SliceAsyncDestructorCtor , Some ( span) ) ;
12351209
1236- blocks = IndexVec :: from_elem_n ( BasicBlockData :: new ( None ) , 2 ) ;
1210+ * blocks = IndexVec :: from_elem_n ( BasicBlockData :: new ( None ) , 2 ) ;
12371211 let slice_async_destructor_bb = BasicBlock :: new ( 0 ) ;
12381212 return_bb = BasicBlock :: new ( 1 ) ;
12391213
12401214 let slice_ptr = if is_array {
12411215 let slice_ptr_ty = Ty :: new_mut_ptr ( tcx, Ty :: new_slice ( tcx, elem_ty) ) ;
1242- let slice_ptr = locals. push ( LocalDecl :: with_source_info ( slice_ptr_ty, source_info) ) ;
1216+ let slice_ptr =
1217+ builder. locals . push ( LocalDecl :: with_source_info ( slice_ptr_ty, source_info) ) ;
12431218
12441219 blocks[ slice_async_destructor_bb] . statements = vec ! [
12451220 Statement { source_info, kind: StatementKind :: StorageLive ( slice_ptr) } ,
@@ -1266,7 +1241,7 @@ fn build_async_destructor_ctor_shim<'tcx>(
12661241 func : Operand :: function_handle (
12671242 tcx,
12681243 slice_async_destructor_fn,
1269- [ elem_ty. into ( ) , /* HOST */ tcx . consts . false_ . into ( ) ] ,
1244+ iter :: once ( elem_ty. into ( ) ) ,
12701245 span,
12711246 ) ,
12721247 args : vec ! [ respan( span, Operand :: Move ( slice_ptr. into( ) ) ) ] ,
@@ -1299,18 +1274,18 @@ fn build_async_destructor_ctor_shim<'tcx>(
12991274 tcx. type_of ( tcx. require_lang_item ( LangItem :: FutureChain , Some ( span) ) ) ;
13001275 let future_chain_fn = tcx. require_lang_item ( LangItem :: FutureChainCtor , Some ( span) ) ;
13011276
1302- locals. raw . reserve (
1277+ builder . locals . raw . reserve (
13031278 1 + LOCALS_PER_ELEM * elem_count + if has_surface_async_drop { 2 } else { 0 } ,
13041279 ) ;
13051280
13061281 // this local is right before element locals
13071282 let ready_unit_local =
1308- locals. push ( LocalDecl :: with_source_info ( ready_unit_ty, source_info) ) ;
1283+ builder . locals . push ( LocalDecl :: with_source_info ( ready_unit_ty, source_info) ) ;
13091284
1310- let locals_base = locals. len ( ) ;
1285+ let locals_base = builder . locals . len ( ) ;
13111286 let mut last_chain_ty = ready_unit_ty;
13121287 // Creating temproraries to store intermediate futuresh
1313- locals. extend (
1288+ builder . locals . extend (
13141289 elem_tys
13151290 . iter ( )
13161291 . rev ( )
@@ -1327,7 +1302,7 @@ fn build_async_destructor_ctor_shim<'tcx>(
13271302 . map ( |ty| LocalDecl :: with_source_info ( ty, source_info) ) ,
13281303 ) ;
13291304
1330- blocks =
1305+ * blocks =
13311306 IndexVec :: from_elem_n ( BasicBlockData :: new ( None ) , 4 + BBS_PER_ELEM * elem_count) ;
13321307 let ready_unit_bb = BasicBlock :: new ( 0 ) ;
13331308 let bbs_base = 1 ;
@@ -1380,12 +1355,7 @@ fn build_async_destructor_ctor_shim<'tcx>(
13801355 blocks[ ready_unit_bb] . terminator = Some ( Terminator {
13811356 source_info,
13821357 kind : TerminatorKind :: Call {
1383- func : Operand :: function_handle (
1384- tcx,
1385- ready_unit_fn,
1386- [ /* HOST */ tcx. consts . false_ . into ( ) ] ,
1387- span,
1388- ) ,
1358+ func : Operand :: function_handle ( tcx, ready_unit_fn, iter:: empty ( ) , span) ,
13891359 args : Vec :: new ( ) ,
13901360 destination : ready_unit_local. into ( ) ,
13911361 target : Some ( chain_nodes ( ) . next ( ) . unwrap ( ) . deferred_dtor_bb ) ,
@@ -1426,7 +1396,7 @@ fn build_async_destructor_ctor_shim<'tcx>(
14261396 func : Operand :: function_handle (
14271397 tcx,
14281398 deferred_async_drop_fn,
1429- [ node. elem_ty . into ( ) , /* HOST */ tcx . consts . false_ . into ( ) ] ,
1399+ iter :: once ( node. elem_ty . into ( ) ) ,
14301400 span,
14311401 ) ,
14321402 args : vec ! [ respan( span, Operand :: Move ( node. elem_ptr_local. into( ) ) ) ] ,
@@ -1452,9 +1422,8 @@ fn build_async_destructor_ctor_shim<'tcx>(
14521422 tcx,
14531423 future_chain_fn,
14541424 [
1455- locals[ node. deferred_dtor_local ] . ty . into ( ) ,
1456- locals[ node. previous_chain_local ] . ty . into ( ) ,
1457- /* HOST */ tcx. consts . false_ . into ( ) ,
1425+ builder. locals [ node. deferred_dtor_local ] . ty . into ( ) ,
1426+ builder. locals [ node. previous_chain_local ] . ty . into ( ) ,
14581427 ] ,
14591428 span,
14601429 ) ,
@@ -1501,11 +1470,11 @@ fn build_async_destructor_ctor_shim<'tcx>(
15011470 ) ;
15021471
15031472 let async_dropper_local =
1504- locals. push ( LocalDecl :: with_source_info ( async_dropper_ty, source_info) ) ;
1473+ builder . locals . push ( LocalDecl :: with_source_info ( async_dropper_ty, source_info) ) ;
15051474 let surface_chain_ty = future_chain_ty
15061475 . instantiate ( tcx, & [ async_dropper_ty. into ( ) , last_chain_ty. into ( ) ] ) ;
15071476 let surface_chain_local =
1508- locals. push ( LocalDecl :: with_source_info ( surface_chain_ty, source_info) ) ;
1477+ builder . locals . push ( LocalDecl :: with_source_info ( surface_chain_ty, source_info) ) ;
15091478
15101479 blocks[ maybe_async_dropper_bb] . statements = vec ! [ Statement {
15111480 source_info,
@@ -1517,7 +1486,7 @@ fn build_async_destructor_ctor_shim<'tcx>(
15171486 func : Operand :: function_handle (
15181487 tcx,
15191488 surface_async_drop_fn,
1520- [ self_ty. into ( ) ] ,
1489+ iter :: once ( self_ty. into ( ) ) ,
15211490 span,
15221491 ) ,
15231492 args : vec ! [ respan( span, Operand :: Move ( self_ptr. into( ) ) ) ] ,
@@ -1539,11 +1508,7 @@ fn build_async_destructor_ctor_shim<'tcx>(
15391508 func : Operand :: function_handle (
15401509 tcx,
15411510 future_chain_fn,
1542- [
1543- async_dropper_ty. into ( ) ,
1544- last_chain_ty. into ( ) ,
1545- /* HOST */ tcx. consts . false_ . into ( ) ,
1546- ] ,
1511+ [ async_dropper_ty. into ( ) , last_chain_ty. into ( ) ] ,
15471512 span,
15481513 ) ,
15491514 args : vec ! [
@@ -1601,10 +1566,11 @@ fn build_async_destructor_ctor_shim<'tcx>(
16011566 }
16021567 }
16031568
1604- blocks[ return_bb] . terminator = Some ( Terminator { source_info, kind : TerminatorKind :: Return } ) ;
1569+ builder. bbs [ return_bb] . terminator =
1570+ Some ( Terminator { source_info, kind : TerminatorKind :: Return } ) ;
16051571
16061572 let source = MirSource :: from_instance ( ty:: InstanceDef :: AsyncDropGlueCtorShim ( def_id, self_ty) ) ;
1607- new_body ( source, blocks , locals, sig . inputs ( ) . len ( ) , span)
1573+ new_body ( source, builder . bbs , builder . locals , ASYNC_DESTRUCTOR_CTOR_ARG_COUNT , span)
16081574}
16091575
16101576const ASYNC_DESTRUCTOR_CTOR_ARG_COUNT : usize = 1 ;
0 commit comments