mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Async functions are now expected to set ExpectedExecutor in their prologue (and, generally, immediately hop to it). I updated the prologue code for a bunch of function emission, most of which was uninteresting. Top-level code was not returning to the main executor, which is now fixed; fortunately, we weren't assuming that we were on the main executor yet. We had some code that only kicked in when an ExpectedExecutor wasn't set which made us capture the current executor before a hop and then return to it later. This code has been removed; there's no situation in which save-and-return is the semantically correct thing to do given the possibility of hop optimization. I suspect it could also have led to crashes if the current executor is being kept alive only because it's currently running code. If we ever add async functions that are supposed to inherit their caller's executor, we should have the caller pass the right executor down to it. This is the first half of SE-0338; the second, sendability enforcement, is much more complicated, and Doug has volunteered to do it. Fixes rdar://79284465, as well as some tests that were XFAILed on Windows.
48 lines
2.9 KiB
Swift
48 lines
2.9 KiB
Swift
// RUN: %empty-directory(%t)
|
|
// RUN: %target-swift-frontend -emit-module -emit-module-path %t/OtherActors.swiftmodule -module-name OtherActors %S/Inputs/OtherActors.swift -disable-availability-checking
|
|
// RUN: %target-swift-emit-silgen -verify -module-name test -I %t -disable-availability-checking -warn-concurrency %s | %FileCheck %s --implicit-check-not=hop_to_executor --enable-var-scope
|
|
// REQUIRES: concurrency
|
|
|
|
import OtherActors
|
|
|
|
// CHECK-LABEL: sil hidden [ossa] @$s4test6check1ySi11OtherActors0C11ModuleActorCYaF : $@convention(thin) @async (@guaranteed OtherModuleActor) -> Int {
|
|
// CHECK: bb0([[SELF:%[0-9]+]] : @guaranteed $OtherModuleActor):
|
|
// CHECK: [[GENERIC_EXEC:%.*]] = enum $Optional<Builtin.Executor>, #Optional.none
|
|
// CHECK-NEXT: hop_to_executor [[GENERIC_EXEC]] : $Optional<Builtin.Executor>
|
|
// CHECK: [[REF:%[0-9]+]] = ref_element_addr [[SELF]] : $OtherModuleActor, #OtherModuleActor.a
|
|
// CHECK: hop_to_executor [[SELF]] : $OtherModuleActor
|
|
// CHECK-NEXT: load [trivial] [[REF]]
|
|
// CHECK-NEXT: hop_to_executor [[GENERIC_EXEC]] : $Optional<Builtin.Executor>
|
|
// CHECK: } // end sil function '$s4test6check1ySi11OtherActors0C11ModuleActorCYaF'
|
|
func check1(_ actor: OtherModuleActor) async -> Int {
|
|
return await actor.a
|
|
}
|
|
|
|
func check2(_ actor: isolated OtherModuleActor) -> Int {
|
|
return actor.a
|
|
}
|
|
|
|
// CHECK-LABEL: sil hidden [ossa] @$s4test6check3ySi11OtherActors0C11ModuleActorCYaF : $@convention(thin) @async (@guaranteed OtherModuleActor) -> Int {
|
|
// CHECK: bb0([[SELF:%[0-9]+]] : @guaranteed $OtherModuleActor):
|
|
// CHECK: [[GENERIC_EXEC:%.*]] = enum $Optional<Builtin.Executor>, #Optional.none
|
|
// CHECK-NEXT: hop_to_executor [[GENERIC_EXEC]] : $Optional<Builtin.Executor>
|
|
func check3(_ actor: OtherModuleActor) async -> Int {
|
|
return actor.b
|
|
}
|
|
|
|
// CHECK-LABEL: sil hidden [ossa] @$s4test6check4y11OtherActors17SomeSendableClassCSgAC0C11ModuleActorCSgYaF : $@convention(thin) @async (@guaranteed Optional<OtherModuleActor>) -> @owned Optional<SomeSendableClass> {
|
|
// CHECK: bb0({{%[0-9]+}} : @guaranteed $Optional<OtherModuleActor>):
|
|
// CHECK: [[GENERIC_EXEC:%.*]] = enum $Optional<Builtin.Executor>, #Optional.none
|
|
// CHECK-NEXT: hop_to_executor [[GENERIC_EXEC]] : $Optional<Builtin.Executor>
|
|
// CHECK: switch_enum {{%[0-9]+}} : $Optional<OtherModuleActor>, case #Optional.some!enumelt: [[SOME:bb[0-9]+]], case #Optional.none!enumelt: {{bb[0-9]+}}
|
|
|
|
// CHECK: [[SOME]]({{%[0-9]+}} : @owned $OtherModuleActor):
|
|
// CHECK: [[REF:%[0-9]+]] = ref_element_addr {{%[0-9]+}} : $OtherModuleActor, #OtherModuleActor.d
|
|
// CHECK: hop_to_executor {{%[0-9]+}} : $OtherModuleActor
|
|
// CHECK-NEXT: load [copy] [[REF]]
|
|
// CHECK: hop_to_executor [[GENERIC_EXEC]] : $Optional<Builtin.Executor>
|
|
// CHECK: } // end sil function '$s4test6check4y11OtherActors17SomeSendableClassCSgAC0C11ModuleActorCSgYaF'
|
|
func check4(_ actor: OtherModuleActor?) async -> SomeSendableClass? {
|
|
return await actor?.d
|
|
}
|