@@ -451,6 +451,52 @@ extension MyActor {
451
451
}
452
452
}
453
453
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
+
454
500
/*-- Partial applications --*/
455
501
456
502
// FIXME: this is wrong; we need to capture the actor value
0 commit comments