Skip to content

Commit dddfdc8

Browse files
committed
[region-isolation] Codegen unsafe continuation result using calls to foreign APIs in the same manner as with checked continuation.
The reason why I am doing this is that the unlike the codegen for checked continuation, the codegen for unchecked continuation uses a sendable value instead of Any as the block storage which prevents me from being able to create a dependency from a non-Sendable @out parameter to the block. By changing to use Any consistently, we are able to take advantage of Any not being sendable to properly propagate this information.
1 parent c9cb122 commit dddfdc8

File tree

4 files changed

+71
-62
lines changed

4 files changed

+71
-62
lines changed

lib/SILGen/ResultPlan.cpp

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -752,34 +752,29 @@ class ForeignAsyncInitializationPlan final : public ResultPlan {
752752
->getCanonicalType();
753753
}
754754

755-
auto blockStorageTy = SILBlockStorageType::get(
756-
checkedBridging ? ctx.TheAnyType : continuationTy);
755+
auto blockStorageTy = SILBlockStorageType::get(ctx.TheAnyType);
757756
auto blockStorage = SGF.emitTemporaryAllocation(
758757
loc, SILType::getPrimitiveAddressType(blockStorageTy));
759758

760759
auto continuationAddr = SGF.B.createProjectBlockStorage(loc, blockStorage);
761760

762761
// Stash continuation in a buffer for a block object.
762+
auto conformances =
763+
collectExistentialConformances(continuationTy, ctx.TheAnyType);
764+
765+
// In this case block storage captures `Any` which would be initialized
766+
// with a continuation.
767+
auto underlyingContinuationAddr = SGF.B.createInitExistentialAddr(
768+
loc, continuationAddr, continuationTy,
769+
SGF.getLoweredType(continuationTy), conformances);
763770

764771
if (checkedBridging) {
765772
auto createIntrinsic =
766773
throws ? SGF.SGM.getCreateCheckedThrowingContinuation()
767774
: SGF.SGM.getCreateCheckedContinuation();
768-
769-
auto conformances = collectExistentialConformances(
770-
continuationTy, ctx.TheAnyType);
771-
772-
// In this case block storage captures `Any` which would be initialized
773-
// with an checked continuation.
774-
auto underlyingContinuationAddr =
775-
SGF.B.createInitExistentialAddr(loc, continuationAddr, continuationTy,
776-
SGF.getLoweredType(continuationTy),
777-
conformances);
778-
779-
auto subs = SubstitutionMap::get(createIntrinsic->getGenericSignature(),
780-
{calleeTypeInfo.substResultType},
781-
conformances);
782-
775+
auto subs =
776+
SubstitutionMap::get(createIntrinsic->getGenericSignature(),
777+
{calleeTypeInfo.substResultType}, conformances);
783778
InitializationPtr underlyingInit(
784779
new KnownAddressInitialization(underlyingContinuationAddr));
785780
auto continuationMV =
@@ -788,7 +783,7 @@ class ForeignAsyncInitializationPlan final : public ResultPlan {
788783
{continuationMV}, SGFContext())
789784
.forwardInto(SGF, loc, underlyingInit.get());
790785
} else {
791-
SGF.B.createStore(loc, wrappedContinuation, continuationAddr,
786+
SGF.B.createStore(loc, wrappedContinuation, underlyingContinuationAddr,
792787
StoreOwnershipQualifier::Trivial);
793788
}
794789

@@ -917,7 +912,7 @@ class ForeignAsyncInitializationPlan final : public ResultPlan {
917912
SGF.B.createProjectBlockStorage(loc, blockStorage);
918913

919914
ManagedValue continuation;
920-
if (checkedBridging) {
915+
{
921916
FormalEvaluationScope scope(SGF);
922917

923918
auto underlyingValueTy =
@@ -930,11 +925,11 @@ class ForeignAsyncInitializationPlan final : public ResultPlan {
930925
continuation = SGF.B.createUncheckedAddrCast(
931926
loc, underlyingValueAddr,
932927
SILType::getPrimitiveAddressType(continuationTy));
933-
} else {
934-
auto continuationVal = SGF.B.createLoad(
935-
loc, continuationAddr, LoadOwnershipQualifier::Trivial);
936-
continuation =
937-
ManagedValue::forObjectRValueWithoutOwnership(continuationVal);
928+
929+
// If we are calling the unsafe variant, we always pass the value in
930+
// registers.
931+
if (!checkedBridging)
932+
continuation = SGF.B.createLoadTrivial(loc, continuation);
938933
}
939934

940935
auto mappedOutContinuationTy =

lib/SILGen/SILGenThunk.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ SILFunction *SILGenModule::getOrCreateForeignAsyncCompletionHandlerImplFunction(
380380
bool checkedBridging = ctx.LangOpts.UseCheckedAsyncObjCBridging;
381381

382382
ManagedValue continuation;
383-
if (checkedBridging) {
383+
{
384384
FormalEvaluationScope scope(SGF);
385385

386386
auto underlyingValueTy = OpenedArchetypeType::get(ctx.TheAnyType);
@@ -393,11 +393,12 @@ SILFunction *SILGenModule::getOrCreateForeignAsyncCompletionHandlerImplFunction(
393393
loc, underlyingValueAddr,
394394
SILType::getPrimitiveAddressType(
395395
F->mapTypeIntoContext(continuationType)->getCanonicalType()));
396-
} else {
397-
auto continuationVal = SGF.B.createLoad(
398-
loc, continuationAddr, LoadOwnershipQualifier::Trivial);
399-
continuation =
400-
ManagedValue::forObjectRValueWithoutOwnership(continuationVal);
396+
397+
// If we are not using checked bridging, we load the continuation from
398+
// memory since we are going to pass it in registers, not in memory to
399+
// the intrinsic.
400+
if (!checkedBridging)
401+
continuation = SGF.B.createLoadTrivial(loc, continuation);
401402
}
402403

403404
// Check for an error if the convention includes one.

test/SILGen/objc_async.swift

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,11 @@ func testSlowServer(slowServer: SlowServer) async throws {
1313
// CHECK: [[METHOD:%.*]] = objc_method {{.*}} $@convention(objc_method) (NSString, @convention(block) (Int) -> (), SlowServer) -> ()
1414
// CHECK: [[CONT:%.*]] = get_async_continuation_addr Int, [[RESUME_BUF]]
1515
// CHECK: [[WRAPPED:%.*]] = struct $UnsafeContinuation<Int, Never> ([[CONT]] : $Builtin.RawUnsafeContinuation)
16-
// CHECK: [[BLOCK_STORAGE:%.*]] = alloc_stack $@block_storage UnsafeContinuation<Int, Never>
16+
// CHECK: [[BLOCK_STORAGE:%.*]] = alloc_stack $@block_storage Any
1717
// CHECK: [[CONT_SLOT:%.*]] = project_block_storage [[BLOCK_STORAGE]]
18-
// CHECK: store [[WRAPPED]] to [trivial] [[CONT_SLOT]]
19-
// CHECK: [[BLOCK_IMPL:%.*]] = function_ref @[[INT_COMPLETION_BLOCK:.*]] : $@convention(c) (@inout_aliasable @block_storage UnsafeContinuation<Int, Never>, Int) -> ()
18+
// CHECK: [[CONT_SLOT_ADDR:%.*]] = init_existential_addr [[CONT_SLOT]]
19+
// CHECK: store [[WRAPPED]] to [trivial] [[CONT_SLOT_ADDR]]
20+
// CHECK: [[BLOCK_IMPL:%.*]] = function_ref @[[INT_COMPLETION_BLOCK:.*]] : $@convention(c) (@inout_aliasable @block_storage Any, Int) -> ()
2021
// CHECK: [[BLOCK:%.*]] = init_block_storage_header [[BLOCK_STORAGE]] {{.*}}, invoke [[BLOCK_IMPL]]
2122
// CHECK: apply [[METHOD]]([[ARG]], [[BLOCK]], %0)
2223
// CHECK: [[COPY:%.*]] = copy_value [[ARG]]
@@ -35,10 +36,11 @@ func testSlowServer(slowServer: SlowServer) async throws {
3536
// CHECK: [[METHOD:%.*]] = objc_method {{.*}} $@convention(objc_method) (@convention(block) (Optional<NSString>, Optional<NSError>) -> (), SlowServer) -> ()
3637
// CHECK: [[CONT:%.*]] = get_async_continuation_addr [throws] String, [[RESUME_BUF]]
3738
// CHECK: [[WRAPPED:%.*]] = struct $UnsafeContinuation<String, any Error> ([[CONT]] : $Builtin.RawUnsafeContinuation)
38-
// CHECK: [[BLOCK_STORAGE:%.*]] = alloc_stack $@block_storage UnsafeContinuation<String, any Error>
39+
// CHECK: [[BLOCK_STORAGE:%.*]] = alloc_stack $@block_storage Any
3940
// CHECK: [[CONT_SLOT:%.*]] = project_block_storage [[BLOCK_STORAGE]]
40-
// CHECK: store [[WRAPPED]] to [trivial] [[CONT_SLOT]]
41-
// CHECK: [[BLOCK_IMPL:%.*]] = function_ref @[[STRING_COMPLETION_THROW_BLOCK:.*]] : $@convention(c) (@inout_aliasable @block_storage UnsafeContinuation<String, any Error>, Optional<NSString>, Optional<NSError>) -> ()
41+
// CHECK: [[CONT_SLOT_ADDR:%.*]] = init_existential_addr [[CONT_SLOT]]
42+
// CHECK: store [[WRAPPED]] to [trivial] [[CONT_SLOT_ADDR]]
43+
// CHECK: [[BLOCK_IMPL:%.*]] = function_ref @[[STRING_COMPLETION_THROW_BLOCK:.*]] : $@convention(c) (@inout_aliasable @block_storage Any, Optional<NSString>, Optional<NSError>) -> ()
4244
// CHECK: [[BLOCK:%.*]] = init_block_storage_header [[BLOCK_STORAGE]] {{.*}}, invoke [[BLOCK_IMPL]]
4345
// CHECK: apply [[METHOD]]([[BLOCK]], %0)
4446
// CHECK: await_async_continuation [[CONT]] {{.*}}, resume [[RESUME:bb[0-9]+]], error [[ERROR:bb[0-9]+]]
@@ -49,17 +51,17 @@ func testSlowServer(slowServer: SlowServer) async throws {
4951
let _: String = try await slowServer.findAnswer()
5052

5153
// CHECK: objc_method {{.*}} $@convention(objc_method) (NSString, @convention(block) () -> (), SlowServer) -> ()
52-
// CHECK: [[BLOCK_IMPL:%.*]] = function_ref @[[VOID_COMPLETION_BLOCK:.*]] : $@convention(c) (@inout_aliasable @block_storage UnsafeContinuation<(), Never>) -> ()
54+
// CHECK: [[BLOCK_IMPL:%.*]] = function_ref @[[VOID_COMPLETION_BLOCK:.*]] : $@convention(c) (@inout_aliasable @block_storage Any) -> ()
5355
await slowServer.serverRestart("somewhere")
5456

55-
// CHECK: function_ref @[[STRING_NONZERO_FLAG_THROW_BLOCK:.*]] : $@convention(c) (@inout_aliasable @block_storage UnsafeContinuation<String, any Error>, {{.*}}Bool, Optional<NSString>, Optional<NSError>) -> ()
57+
// CHECK: function_ref @[[STRING_NONZERO_FLAG_THROW_BLOCK:.*]] : $@convention(c) (@inout_aliasable @block_storage Any, {{.*}}Bool, Optional<NSString>, Optional<NSError>) -> ()
5658
let _: String = try await slowServer.doSomethingFlaggy()
57-
// CHECK: function_ref @[[STRING_ZERO_FLAG_THROW_BLOCK:.*]] : $@convention(c) (@inout_aliasable @block_storage UnsafeContinuation<String, any Error>, Optional<NSString>, {{.*}}Bool, Optional<NSError>) -> ()
59+
// CHECK: function_ref @[[STRING_ZERO_FLAG_THROW_BLOCK:.*]] : $@convention(c) (@inout_aliasable @block_storage Any, Optional<NSString>, {{.*}}Bool, Optional<NSError>) -> ()
5860
let _: String = try await slowServer.doSomethingZeroFlaggy()
59-
// CHECK: function_ref @[[STRING_STRING_ZERO_FLAG_THROW_BLOCK:.*]] : $@convention(c) (@inout_aliasable @block_storage UnsafeContinuation<(String, String), any Error>, {{.*}}Bool, Optional<NSString>, Optional<NSError>, Optional<NSString>) -> ()
61+
// CHECK: function_ref @[[STRING_STRING_ZERO_FLAG_THROW_BLOCK:.*]] : $@convention(c) (@inout_aliasable @block_storage Any, {{.*}}Bool, Optional<NSString>, Optional<NSError>, Optional<NSString>) -> ()
6062
let _: (String, String) = try await slowServer.doSomethingMultiResultFlaggy()
6163

62-
// CHECK: [[BLOCK_IMPL:%.*]] = function_ref @[[NSSTRING_INT_THROW_COMPLETION_BLOCK:.*]] : $@convention(c) (@inout_aliasable @block_storage UnsafeContinuation<(String, Int), any Error>, Optional<NSString>, Int, Optional<NSError>) -> ()
64+
// CHECK: [[BLOCK_IMPL:%.*]] = function_ref @[[NSSTRING_INT_THROW_COMPLETION_BLOCK:.*]] : $@convention(c) (@inout_aliasable @block_storage Any, Optional<NSString>, Int, Optional<NSError>) -> ()
6365
let (_, _): (String, Int) = try await slowServer.findMultipleAnswers()
6466

6567
let (_, _): (Bool, Bool) = try await slowServer.findDifferentlyFlavoredBooleans()
@@ -103,7 +105,9 @@ func testGeneric2<T: AnyObject, U>(x: GenericObject<T>, y: U) async throws {
103105

104106
// CHECK: sil{{.*}}@[[INT_COMPLETION_BLOCK]]
105107
// CHECK: [[CONT_ADDR:%.*]] = project_block_storage %0
106-
// CHECK: [[CONT:%.*]] = load [trivial] [[CONT_ADDR]]
108+
// CHECK: [[CONT_OPEN_EXT:%.*]] = open_existential_addr immutable_access [[CONT_ADDR]]
109+
// CHECK: [[CONT_CAST:%.*]] = unchecked_addr_cast [[CONT_OPEN_EXT]]
110+
// CHECK: [[CONT:%.*]] = load [trivial] [[CONT_CAST]]
107111
// CHECK: [[RESULT_BUF:%.*]] = alloc_stack $Int
108112
// CHECK: store %1 to [trivial] [[RESULT_BUF]]
109113
// CHECK: [[RESUME:%.*]] = function_ref @{{.*}}resumeUnsafeContinuation
@@ -113,7 +117,9 @@ func testGeneric2<T: AnyObject, U>(x: GenericObject<T>, y: U) async throws {
113117
// CHECK: [[RESUME_IN:%.*]] = copy_value %1
114118
// CHECK: [[ERROR_IN:%.*]] = copy_value %2
115119
// CHECK: [[CONT_ADDR:%.*]] = project_block_storage %0
116-
// CHECK: [[CONT:%.*]] = load [trivial] [[CONT_ADDR]]
120+
// CHECK: [[CONT_ADDR_OPENED:%.*]] = open_existential_addr immutable_access [[CONT_ADDR]]
121+
// CHECK: [[CONT_ADDR_CAST:%.*]] = unchecked_addr_cast [[CONT_ADDR_OPENED]]
122+
// CHECK: [[CONT:%.*]] = load [trivial] [[CONT_ADDR_CAST]]
117123
// CHECK: [[ERROR_IN_B:%.*]] = begin_borrow [[ERROR_IN]]
118124
// CHECK: switch_enum [[ERROR_IN_B]] : {{.*}}, case #Optional.some!enumelt: [[ERROR_BB:bb[0-9]+]], case #Optional.none!enumelt: [[RESUME_BB:bb[0-9]+]]
119125
// CHECK: [[RESUME_BB]]:
@@ -136,7 +142,9 @@ func testGeneric2<T: AnyObject, U>(x: GenericObject<T>, y: U) async throws {
136142

137143
// CHECK: sil {{.*}} @[[VOID_COMPLETION_BLOCK]]
138144
// CHECK: [[CONT_ADDR:%.*]] = project_block_storage %0
139-
// CHECK: [[CONT:%.*]] = load [trivial] [[CONT_ADDR]]
145+
// CHECK: [[CONT_OPEN:%.*]] = open_existential_addr immutable_access [[CONT_ADDR]]
146+
// CHECK: [[CONT_CAST:%.*]] = unchecked_addr_cast [[CONT_OPEN]]
147+
// CHECK: [[CONT:%.*]] = load [trivial] [[CONT_CAST]]
140148
// CHECK: [[RESULT_BUF:%.*]] = alloc_stack $()
141149
// CHECK: [[RESUME:%.*]] = function_ref @{{.*}}resumeUnsafeContinuation
142150
// CHECK: apply [[RESUME]]<()>([[CONT]], [[RESULT_BUF]])
@@ -184,10 +192,11 @@ func testSlowServerFromMain(slowServer: SlowServer) async throws {
184192
// CHECK: [[METHOD:%.*]] = objc_method {{.*}} $@convention(objc_method) (NSString, @convention(block) (Int) -> (), SlowServer) -> ()
185193
// CHECK: [[CONT:%.*]] = get_async_continuation_addr Int, [[RESUME_BUF]]
186194
// CHECK: [[WRAPPED:%.*]] = struct $UnsafeContinuation<Int, Never> ([[CONT]] : $Builtin.RawUnsafeContinuation)
187-
// CHECK: [[BLOCK_STORAGE:%.*]] = alloc_stack $@block_storage UnsafeContinuation<Int, Never>
195+
// CHECK: [[BLOCK_STORAGE:%.*]] = alloc_stack $@block_storage Any
188196
// CHECK: [[CONT_SLOT:%.*]] = project_block_storage [[BLOCK_STORAGE]]
189-
// CHECK: store [[WRAPPED]] to [trivial] [[CONT_SLOT]]
190-
// CHECK: [[BLOCK_IMPL:%.*]] = function_ref @[[INT_COMPLETION_BLOCK:.*]] : $@convention(c) (@inout_aliasable @block_storage UnsafeContinuation<Int, Never>, Int) -> ()
197+
// CHECK: [[CONT_SLOT_ANY:%.*]] = init_existential_addr [[CONT_SLOT]]
198+
// CHECK: store [[WRAPPED]] to [trivial] [[CONT_SLOT_ANY]]
199+
// CHECK: [[BLOCK_IMPL:%.*]] = function_ref @[[INT_COMPLETION_BLOCK:.*]] : $@convention(c) (@inout_aliasable @block_storage Any, Int) -> ()
191200
// CHECK: [[BLOCK:%.*]] = init_block_storage_header [[BLOCK_STORAGE]] {{.*}}, invoke [[BLOCK_IMPL]]
192201
// CHECK: apply [[METHOD]]([[ARG]], [[BLOCK]], %0)
193202
// CHECK: [[COPY:%.*]] = copy_value [[ARG]]
@@ -210,15 +219,16 @@ func testThrowingMethodFromMain(slowServer: SlowServer) async -> String {
210219
// CHECK: [[METH:%.*]] = objc_method {{%.*}} : $SlowServer, #SlowServer.doSomethingDangerous!foreign
211220
// CHECK: [[RAW_CONT:%.*]] = get_async_continuation_addr [throws] String, [[RESULT_BUF]] : $*String
212221
// CHECK: [[CONT:%.*]] = struct $UnsafeContinuation<String, any Error> ([[RAW_CONT]] : $Builtin.RawUnsafeContinuation)
213-
// CHECK: [[STORE_ALLOC:%.*]] = alloc_stack $@block_storage UnsafeContinuation<String, any Error>
222+
// CHECK: [[STORE_ALLOC:%.*]] = alloc_stack $@block_storage Any
214223
// CHECK: [[PROJECTED:%.*]] = project_block_storage [[STORE_ALLOC]] : $*@block_storage
215-
// CHECK: store [[CONT]] to [trivial] [[PROJECTED]] : $*UnsafeContinuation<String, any Error>
224+
// CHECK: [[PROJECTED_ANY:%.*]] = init_existential_addr [[PROJECTED]]
225+
// CHECK: store [[CONT]] to [trivial] [[PROJECTED_ANY]]
216226
// CHECK: [[INVOKER:%.*]] = function_ref @$sSo8NSStringCSgSo7NSErrorCSgIeyByy_SSTz_
217227
// CHECK: [[BLOCK:%.*]] = init_block_storage_header [[STORE_ALLOC]] {{.*}}, invoke [[INVOKER]]
218228
// CHECK: [[OPTIONAL_BLK:%.*]] = enum {{.*}}, #Optional.some!enumelt, [[BLOCK]]
219-
// CHECK: %28 = apply [[METH]]([[STRING_ARG]], [[OPTIONAL_BLK]], {{%.*}}) : $@convention(objc_method) (NSString, Optional<@convention(block) (Optional<NSString>, Optional<NSError>) -> ()>, SlowServer) -> ()
229+
// CHECK: apply [[METH]]([[STRING_ARG]], [[OPTIONAL_BLK]], {{%.*}}) : $@convention(objc_method) (NSString, Optional<@convention(block) (Optional<NSString>, Optional<NSError>) -> ()>, SlowServer) -> ()
220230
// CHECK: [[STRING_ARG_COPY:%.*]] = copy_value [[STRING_ARG]] : $NSString
221-
// CHECK: dealloc_stack [[STORE_ALLOC]] : $*@block_storage UnsafeContinuation<String, any Error>
231+
// CHECK: dealloc_stack [[STORE_ALLOC]] : $*@block_storage Any
222232
// CHECK: destroy_value [[STRING_ARG]] : $NSString
223233
// CHECK: await_async_continuation [[RAW_CONT]] : $Builtin.RawUnsafeContinuation, resume [[RESUME:bb[0-9]+]], error [[ERROR:bb[0-9]+]]
224234

@@ -288,11 +298,12 @@ extension OptionalMemberLookups {
288298
// CHECK: [[SELF:%[0-9]+]] = copy_value {{.*}} : $Self
289299
// CHECK: [[METH:%[0-9]+]] = objc_method {{.*}} : $Self, #OptionalMemberLookups.generateMaybe!foreign : <Self where Self : OptionalMemberLookups> (Self) -> () async -> (), $@convention(objc_method) (@convention(block) () -> (), Self) -> ()
290300
// CHECK: [[CONT:%.*]] = struct $UnsafeContinuation<(), Never> (%10 : $Builtin.RawUnsafeContinuation)
291-
// CHECK: [[BLOCK_STORAGE:%.*]] = alloc_stack $@block_storage UnsafeContinuation<(), Never>
292-
// CHECK: [[PROJECTED:%.*]] = project_block_storage [[BLOCK_STORAGE]] : $*@block_storage UnsafeContinuation<(), Never>
293-
// CHECK: store [[CONT]] to [trivial] [[PROJECTED]] : $*UnsafeContinuation<(), Never>
294-
// CHECK: = function_ref @$sIeyB_yt10objc_async21OptionalMemberLookupsRzlTz_ : $@convention(c) @pseudogeneric <τ_0_0 where τ_0_0 : OptionalMemberLookups> (@inout_aliasable @block_storage UnsafeContinuation<(), Never>) -> ()
295-
// CHECK: [[BLOCK:%[0-9]+]] = init_block_storage_header {{.*}} : $*@block_storage UnsafeContinuation<(), Never>
301+
// CHECK: [[BLOCK_STORAGE:%.*]] = alloc_stack $@block_storage
302+
// CHECK: [[PROJECTED:%.*]] = project_block_storage [[BLOCK_STORAGE]] : $*@block_storage
303+
// CHECK: [[PROJECTED_ANY:%.*]] = init_existential_addr [[PROJECTED]]
304+
// CHECK: store [[CONT]] to [trivial] [[PROJECTED_ANY]]
305+
// CHECK: = function_ref @$sIeyB_yt10objc_async21OptionalMemberLookupsRzlTz_ : $@convention(c) @pseudogeneric <τ_0_0 where τ_0_0 : OptionalMemberLookups> (@inout_aliasable @block_storage Any) -> ()
306+
// CHECK: [[BLOCK:%[0-9]+]] = init_block_storage_header {{.*}} : $*@block_storage
296307
// CHECK: = apply [[METH]]([[BLOCK]], [[SELF]]) : $@convention(objc_method) (@convention(block) () -> (), Self) -> ()
297308
// CHECK: await_async_continuation {{.*}} : $Builtin.RawUnsafeContinuation, resume bb1
298309
// CHECK: hop_to_executor {{.*}} : $MainActor

0 commit comments

Comments
 (0)