@@ -451,6 +451,52 @@ extension MyActor {
451451 }
452452}
453453
454+ /*-- Generic actors --*/
455+
456+ actor GenericActor < T> {
457+ func asyncAction( ) async { }
458+ }
459+
460+ // CHECK-LABEL: sil hidden [ossa] @$s4test12GenericActorC0a5ErasebC0yyF
461+ // CHECK: // function_ref closure #1
462+ // CHECK-NEXT: [[CLOSURE_FN:%.*]] = function_ref @$s4test12GenericActorC0a5ErasebC0yyFyyYaYbcfU_ : $@convention(thin) @Sendable @async <τ_0_0> (@guaranteed Optional<any Actor>, @sil_isolated @guaranteed GenericActor<τ_0_0>) -> ()
463+ // CHECK-NEXT: [[CAPTURE:%.*]] = copy_value %0 : $GenericActor<T>
464+ // CHECK-NEXT: [[CAPTURE_FOR_ISOLATION:%.*]] = copy_value [[CAPTURE]] : $GenericActor<T>
465+ // CHECK-NEXT: [[ISOLATION_OBJECT:%.*]] = init_existential_ref [[CAPTURE_FOR_ISOLATION]] : $GenericActor<T> : $GenericActor<T>, $any Actor
466+ // CHECK-NEXT: [[ISOLATION:%.*]] = enum $Optional<any Actor>, #Optional.some!enumelt, [[ISOLATION_OBJECT]] : $any Actor
467+ // CHECK-NEXT: [[CLOSURE:%.*]] = partial_apply [callee_guaranteed] [isolated_any] [[CLOSURE_FN]]<T>([[ISOLATION]], [[CAPTURE]])
468+ // CHECK-NEXT: // function_ref
469+ // CHECK-NEXT: [[TAKE_FN:%.*]] = function_ref @$s4test30takeInheritingAsyncIsolatedAny2fnyyyYaYbYAc_tF
470+ // CHECK-NEXT: apply [[TAKE_FN]]([[CLOSURE]])
471+ // CHECK-NEXT: destroy_value [[CLOSURE]]
472+ extension GenericActor {
473+ func testEraseGenericActor( ) {
474+ takeInheritingAsyncIsolatedAny {
475+ await self . asyncAction ( )
476+ }
477+ }
478+ }
479+
480+ // CHECK-LABEL: sil hidden [ossa] @$s4test12GenericActorCAASiRszlE0a16EraseSpecializedbC0yyF
481+ // CHECK: // function_ref closure #1
482+ // CHECK-NEXT: [[CLOSURE_FN:%.*]] = function_ref @$s4test12GenericActorCAASiRszlE0a16EraseSpecializedbC0yyFyyYaYbcfU_ : $@convention(thin) @Sendable @async (@guaranteed Optional<any Actor>, @sil_isolated @guaranteed GenericActor<Int>) -> ()
483+ // CHECK-NEXT: [[CAPTURE:%.*]] = copy_value %0 : $GenericActor<Int>
484+ // CHECK-NEXT: [[CAPTURE_FOR_ISOLATION:%.*]] = copy_value [[CAPTURE]] : $GenericActor<Int>
485+ // CHECK-NEXT: [[ISOLATION_OBJECT:%.*]] = init_existential_ref [[CAPTURE_FOR_ISOLATION]] : $GenericActor<Int> : $GenericActor<Int>, $any Actor
486+ // CHECK-NEXT: [[ISOLATION:%.*]] = enum $Optional<any Actor>, #Optional.some!enumelt, [[ISOLATION_OBJECT]] : $any Actor
487+ // CHECK-NEXT: [[CLOSURE:%.*]] = partial_apply [callee_guaranteed] [isolated_any] [[CLOSURE_FN]]([[ISOLATION]], [[CAPTURE]])
488+ // CHECK-NEXT: // function_ref
489+ // CHECK-NEXT: [[TAKE_FN:%.*]] = function_ref @$s4test30takeInheritingAsyncIsolatedAny2fnyyyYaYbYAc_tF
490+ // CHECK-NEXT: apply [[TAKE_FN]]([[CLOSURE]])
491+ // CHECK-NEXT: destroy_value [[CLOSURE]]
492+ extension GenericActor where T == Int {
493+ func testEraseSpecializedGenericActor( ) {
494+ takeInheritingAsyncIsolatedAny {
495+ await self . asyncAction ( )
496+ }
497+ }
498+ }
499+
454500/*-- Partial applications --*/
455501
456502// FIXME: this is wrong; we need to capture the actor value
0 commit comments