Files
swift-mirror/test/Distributed/Runtime/distributed_actor_localSystem_distributedProtocol.swift
Konrad 'ktoso' Malawski 362783c0f8 [Distributed] Don't drop dist get accessors from witness tables.
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
2025-06-05 12:16:20 +09:00

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
}
}