1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
// RUN: %empty-directory(%t)
// RUN: %target-swift-frontend -emit-ir -swift-version 6 -O -I %t %s
// RUN: %target-swift-frontend -emit-sil -swift-version 6 -O -I %t %s | %FileCheck %s
// REQUIRES: concurrency
// REQUIRES: distributed
// REQUIRES: OS=macosx || OS=ios
import Distributed
// NOTE: None of the ad-hoc protocol requirement implementations
public protocol Transferable: Sendable {}
// NOT final on purpose
public class TheSpecificResultHandlerWhichIsANonFinalClass: DistributedTargetInvocationResultHandler {
public typealias SerializationRequirement = Transferable
public func onReturn<Success>(value: Success) async throws where Success: Transferable {
}
public func onReturnVoid() async throws {
fatalError()
}
public func onThrow<Err>(error: Err) async throws where Err : Error {
fatalError()
}
}
// NOT final on purpose
public class FakeInvocationDecoder: DistributedTargetInvocationDecoder {
public typealias SerializationRequirement = Transferable
public func decodeGenericSubstitutions() throws -> [Any.Type] {
[]
}
public func decodeNextArgument<Argument: SerializationRequirement>() throws -> Argument {
fatalError()
}
public func decodeErrorType() throws -> Any.Type? {
nil
}
public func decodeReturnType() throws -> Any.Type? {
nil
}
}
// NOT final on purpose
public class FakeInvocationEncoder : DistributedTargetInvocationEncoder {
public typealias SerializationRequirement = Transferable
public func recordArgument<Value: SerializationRequirement>(
_ argument: RemoteCallArgument<Value>) throws {
}
public func recordGenericSubstitution<T>(_ type: T.Type) throws {
}
public func recordErrorType<E: Error>(_ type: E.Type) throws {
}
public func recordReturnType<R: SerializationRequirement>(_ type: R.Type) throws {
}
public func doneRecording() throws {
}
}
// NOT final on purpose
public class NotFinalActorSystemForAdHocRequirementTest: DistributedActorSystem, @unchecked Sendable {
public typealias ActorID = String
public typealias InvocationEncoder = FakeInvocationEncoder
public typealias InvocationDecoder = FakeInvocationDecoder
public typealias SerializationRequirement = Transferable
public typealias ResultHandler = TheSpecificResultHandlerWhichIsANonFinalClass
public init() {}
public func resolve<Act>(id: ActorID, as actorType: Act.Type)
throws -> Act? where Act: DistributedActor {
fatalError()
}
public func assignID<Act>(_ actorType: Act.Type) -> ActorID
where Act: DistributedActor {
fatalError()
}
public func actorReady<Act>(_ actor: Act) where Act: DistributedActor, Act.ID == ActorID {
fatalError()
}
public func resignID(_ id: ActorID) {
fatalError()
}
public func makeInvocationEncoder() -> InvocationEncoder {
fatalError()
}
public func remoteCall<Act, Err, Res>(
on actor: Act,
target: RemoteCallTarget,
invocation: inout InvocationEncoder,
throwing errorType: Err.Type,
returning returnType: Res.Type
) async throws -> Res
where Act: DistributedActor,
Act.ID == ActorID,
Err: Error,
Res: SerializationRequirement {
fatalError()
}
public func remoteCallVoid<Act, Err>(
on actor: Act,
target: RemoteCallTarget,
invocation: inout InvocationEncoder,
throwing errorType: Err.Type
) async throws
where Act: DistributedActor,
Act.ID == ActorID,
Err: Error {
fatalError()
}
}
// FIXME: This call should be devirtualized but it cannot be done at the moment due to issues with ad-hoc serialization requirement.
// CHECK-LABEL: sil shared [transparent] [thunk] @$s52distributed_actor_adhoc_requirements_optimized_build42NotFinalActorSystemForAdHocRequirementTestC11Distributed0piJ0AadEP10remoteCall2on6target10invocation8throwing9returningqd_1_qd___AD06RemoteR6TargetV17InvocationEncoderQzzqd_0_mqd_1_mtYaKAD0pI0Rd__s5ErrorRd_0_2IDQyd__0I2IDRtzr1_lFTW
// CHECK: bb0(%0 : $*τ_0_2, %1 : $τ_0_0, %2 : $*RemoteCallTarget, %3 : $*FakeInvocationEncoder, %4 : $@thick τ_0_1.Type, %5 : $@thick τ_0_2.Type, %6 : $*NotFinalActorSystemForAdHocRequirementTest):
// CHECK-NEXT: [[DIST_IMPL:%.*]] = load %6
// CHECK-NEXT: [[REMOTE_CALL_WITNESS:%.*]] = class_method [[DIST_IMPL]] : $NotFinalActorSystemForAdHocRequirementTest, #NotFinalActorSystemForAdHocRequirementTest.remoteCall
// CHECK-NEXT: try_apply [[REMOTE_CALL_WITNESS]]<τ_0_0, τ_0_1, τ_0_2>(%0, %1, %2, %3, %4, %5, [[DIST_IMPL]])
|