diff --git a/lib/IRGen/GenMeta.cpp b/lib/IRGen/GenMeta.cpp index 5b6c5854c9c11..62facbd61f240 100644 --- a/lib/IRGen/GenMeta.cpp +++ b/lib/IRGen/GenMeta.cpp @@ -1000,8 +1000,7 @@ namespace { // Emit the dispatch thunk. auto shouldEmitDispatchThunk = - (Resilient || IGM.getOptions().WitnessMethodElimination) && - (!func.isDistributed() || !func.isDistributedThunk()); + (Resilient || IGM.getOptions().WitnessMethodElimination); if (shouldEmitDispatchThunk) { IGM.emitDispatchThunk(func); } @@ -1082,14 +1081,10 @@ namespace { // Define the method descriptor. SILDeclRef func(entry.getFunction()); - /// Distributed thunks don't need method descriptors - if (!func.isDistributedThunk()) { - auto *descriptor = - B.getAddrOfCurrentPosition( - IGM.ProtocolRequirementStructTy); - IGM.defineMethodDescriptor(func, Proto, descriptor, - IGM.ProtocolRequirementStructTy); - } + auto *descriptor = + B.getAddrOfCurrentPosition(IGM.ProtocolRequirementStructTy); + IGM.defineMethodDescriptor(func, Proto, descriptor, + IGM.ProtocolRequirementStructTy); } } diff --git a/lib/IRGen/GenProto.cpp b/lib/IRGen/GenProto.cpp index 695beeca36789..f9537053e984c 100644 --- a/lib/IRGen/GenProto.cpp +++ b/lib/IRGen/GenProto.cpp @@ -2348,12 +2348,6 @@ namespace { LinkEntity::forBaseConformanceDescriptor(requirement)); B.addRelativeAddress(baseConformanceDescriptor); } else if (entry.getKind() == SILWitnessTable::Method) { - // distributed thunks don't need resilience - if (entry.getMethodWitness().Requirement.isDistributedThunk()) { - witnesses = witnesses.drop_back(); - continue; - } - // Method descriptor. auto declRef = entry.getMethodWitness().Requirement; auto requirement = diff --git a/lib/IRGen/IRSymbolVisitor.cpp b/lib/IRGen/IRSymbolVisitor.cpp index 7134aa8752b9f..b62d906146aa4 100644 --- a/lib/IRGen/IRSymbolVisitor.cpp +++ b/lib/IRGen/IRSymbolVisitor.cpp @@ -157,14 +157,6 @@ class IRSymbolVisitorImpl : public SILSymbolVisitor { } void addMethodDescriptor(SILDeclRef declRef) override { - if (declRef.isDistributedThunk()) { - auto afd = declRef.getAbstractFunctionDecl(); - auto DC = afd->getDeclContext(); - if (isa(DC)) { - return; - } - } - addLinkEntity(LinkEntity::forMethodDescriptor(declRef)); } diff --git a/lib/SIL/IR/SILSymbolVisitor.cpp b/lib/SIL/IR/SILSymbolVisitor.cpp index be6078d41eade..3da9722583e55 100644 --- a/lib/SIL/IR/SILSymbolVisitor.cpp +++ b/lib/SIL/IR/SILSymbolVisitor.cpp @@ -835,7 +835,6 @@ class SILSymbolVisitorImpl : public ASTVisitor { V.Ctx.getOpts().WitnessMethodElimination} {} void addMethod(SILDeclRef declRef) { - // TODO: alternatively maybe prevent adding distributed thunk here rather than inside those? if (Resilient || WitnessMethodElimination) { Visitor.addDispatchThunk(declRef); Visitor.addMethodDescriptor(declRef); diff --git a/test/Distributed/Runtime/distributed_actor_library_evolution_da_protocol_use.swift b/test/Distributed/Runtime/distributed_actor_library_evolution_da_protocol_use.swift new file mode 100644 index 0000000000000..e4f65597d2420 --- /dev/null +++ b/test/Distributed/Runtime/distributed_actor_library_evolution_da_protocol_use.swift @@ -0,0 +1,54 @@ +// REQUIRES: VENDOR=apple +// REQUIRES: OS=macosx || OS=linux-gnu +// REQUIRES: concurrency +// REQUIRES: distributed +// UNSUPPORTED: use_os_stdlib + +// RUN: %empty-directory(%t) +// RUN: split-file %s %t + +// RUN: %target-build-swift -Xfrontend -validate-tbd-against-ir=all -enable-library-evolution -target %target-cpu-apple-macosx13.0 -parse-as-library -emit-library -emit-module-path %t/Library.swiftmodule -module-name Library %t/library.swift -o %t/%target-library-name(Library) +// RUN: %target-build-swift -Xfrontend -validate-tbd-against-ir=all -target %target-cpu-apple-macosx13.0 -parse-as-library -lLibrary -module-name main -I %t -L %t %t/main.swift -o %t/a.out + +// RUN: %target-codesign %t/a.out +// RUN: %target-run %t/a.out | %FileCheck %s + +//--- library.swift +import Distributed + +public protocol SimpleProtocol: DistributedActor + where ActorSystem == LocalTestingDistributedActorSystem { + + // nonisolated override var id: ID { get } // comes from DistributedActor + + // Has to have a distributed method to fail + distributed func test() -> Int +} + +//--- main.swift +import Distributed +import Library + +public distributed actor SimpleActor: SimpleProtocol { + public distributed func test() -> Int { + print("SimpleActor.test") + return 1 + } +} + +public func makeFromFail(_ act: Act) async { + print(act.id) + try! await print("act.test() = \(act.test())") + // CHECK: SimpleActor.test + // CHECK: act.test() = 1 +} + +@main +struct TestSwiftFrameworkTests { + static func main() async { + let system = LocalTestingDistributedActorSystem() + + let simpleActor = SimpleActor(actorSystem: system) + await makeFromFail(simpleActor) + } +} \ No newline at end of file