mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
This actually manifested as an pointer auth crash, but the real reason being is that we messed up the order of elements in the witness table. If we'd skip the accessor like this, the types we sign/auth with would no longer align and manifest in a crash. There is no real reason to skip this entry so we just bring it back, and avoid making this special in any way. This unlocks a few tests as well as corrects any distributed+protocol use where a requirement distributed var was _followed by_ other requirements. resolves rdar://125628060
68 lines
1.9 KiB
Swift
68 lines
1.9 KiB
Swift
// RUN: %empty-directory(%t)
|
|
// RUN: %target-build-swift -module-name main -j2 -parse-as-library -I %t %s -plugin-path %swift-plugin-dir -o %t/a.out
|
|
// RUN: %target-codesign %t/a.out
|
|
// RUN: %target-run %t/a.out | %FileCheck %s --color
|
|
|
|
// REQUIRES: executable_test
|
|
// REQUIRES: concurrency
|
|
// REQUIRES: distributed
|
|
|
|
// rdar://76038845
|
|
// UNSUPPORTED: use_os_stdlib
|
|
// UNSUPPORTED: back_deployment_runtime
|
|
|
|
// rdar://90373022
|
|
// UNSUPPORTED: OS=watchos
|
|
|
|
import Distributed
|
|
|
|
@Resolvable
|
|
@available(SwiftStdlib 6.0, *)
|
|
protocol WorkerProtocol: DistributedActor where ActorSystem == LocalTestingDistributedActorSystem {
|
|
distributed func distributedMethod() -> String
|
|
distributed var distributedVariable: String { get }
|
|
distributed func genericMethod<E: Codable>(_ value: E) async -> E
|
|
}
|
|
|
|
@available(SwiftStdlib 6.0, *)
|
|
distributed actor Worker: WorkerProtocol {
|
|
distributed func distributedMethod() -> String {
|
|
"implemented method"
|
|
}
|
|
|
|
distributed var distributedVariable: String {
|
|
"implemented variable"
|
|
}
|
|
|
|
distributed func genericMethod<E: Codable>(_ value: E) async -> E {
|
|
return value
|
|
}
|
|
}
|
|
|
|
// ==== Execute ----------------------------------------------------------------
|
|
|
|
|
|
@available(SwiftStdlib 6.0, *)
|
|
func test_distributedVariable<DA: WorkerProtocol>(actor: DA) async throws -> String {
|
|
try await actor.distributedVariable
|
|
}
|
|
|
|
@available(SwiftStdlib 6.0, *)
|
|
@main struct Main {
|
|
static func main() async throws {
|
|
let system = LocalTestingDistributedActorSystem()
|
|
|
|
let actor: any WorkerProtocol = Worker(actorSystem: system)
|
|
|
|
let m = try await actor.distributedMethod()
|
|
print("m = \(m)") // CHECK: m = implemented method
|
|
|
|
// force a call through witness table
|
|
let v1 = try await test_distributedVariable(actor: actor)
|
|
print("v1 = \(v1)") // CHECK: v1 = implemented variable
|
|
|
|
let v2 = try await actor.distributedVariable
|
|
print("v2 = \(v2)") // CHECK: v2 = implemented variable
|
|
}
|
|
}
|