Skip to content

Commit 181161c

Browse files
authored
Merge pull request #66020 from ktoso/wip-distributed-dont-crash-compile-on-empty-system
2 parents 8dcf757 + 00243c6 commit 181161c

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

lib/Sema/DerivedConformanceDistributedActor.cpp

+9
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,15 @@ bool DerivedConformance::canDeriveDistributedActor(
5151
bool DerivedConformance::canDeriveDistributedActorSystem(
5252
NominalTypeDecl *nominal, DeclContext *dc) {
5353
auto &C = nominal->getASTContext();
54+
55+
// Make sure ad-hoc requirements that we'll use in synthesis are present, before we try to use them.
56+
// This leads to better error reporting because we already have errors happening (missing witnesses).
57+
if (auto handlerType = getDistributedActorSystemResultHandlerType(nominal)) {
58+
if (!C.getOnReturnOnDistributedTargetInvocationResultHandler(
59+
handlerType->getAnyNominal()))
60+
return false;
61+
}
62+
5463
return C.getLoadedModule(C.Id_Distributed);
5564
}
5665

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-swift-frontend -typecheck -verify -disable-availability-checking 2>&1 %s
3+
// REQUIRES: concurrency
4+
// REQUIRES: distributed
5+
6+
import Distributed
7+
8+
public final class CompletelyHollowActorSystem: DistributedActorSystem {
9+
// expected-error@-1{{type 'CompletelyHollowActorSystem' does not conform to protocol 'DistributedActorSystem'}}
10+
// expected-note@-2{{protocol 'DistributedActorSystem' requires function 'remoteCallVoid' with signature:}}
11+
// expected-error@-3{{class 'CompletelyHollowActorSystem' is missing witness for protocol requirement 'remoteCall'}}
12+
// expected-note@-4{{protocol 'DistributedActorSystem' requires function 'remoteCall' with signature:}}
13+
// expected-error@-5{{class 'CompletelyHollowActorSystem' is missing witness for protocol requirement 'remoteCallVoid'}}
14+
15+
public typealias ActorID = String
16+
public typealias InvocationEncoder = Encoder
17+
// expected-note@-1{{possibly intended match 'CompletelyHollowActorSystem.InvocationEncoder' (aka 'CompletelyHollowActorSystem.Encoder') does not conform to 'DistributedTargetInvocationEncoder'}}
18+
public typealias InvocationDecoder = Decoder
19+
// expected-note@-1{{possibly intended match 'CompletelyHollowActorSystem.InvocationDecoder' (aka 'CompletelyHollowActorSystem.Decoder') does not conform to 'DistributedTargetInvocationDecoder'}}
20+
21+
public typealias SerializationRequirement = Codable
22+
23+
public func actorReady<Act>(_ actor: Act) where Act : DistributedActor, ActorID == Act.ID {
24+
25+
}
26+
27+
public struct Encoder: InvocationEncoder {
28+
29+
}
30+
31+
public struct Decoder: InvocationDecoder {
32+
33+
}
34+
35+
public struct ResultHandler: DistributedTargetInvocationResultHandler {
36+
// expected-error@-1{{type 'CompletelyHollowActorSystem.ResultHandler' does not conform to protocol 'DistributedTargetInvocationResultHandler'}}
37+
}
38+
39+
}

0 commit comments

Comments
 (0)