Skip to content

Commit 7763528

Browse files
committed
[Distributed] Harden distributed_actor_deinit.swift
1 parent e004e6a commit 7763528

File tree

2 files changed

+35
-25
lines changed

2 files changed

+35
-25
lines changed

lib/Sema/TypeCheckDeclPrimary.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2941,10 +2941,8 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
29412941

29422942
checkExplicitAvailability(ED);
29432943

2944-
if (nominal->isDistributedActor()) {
2945-
auto decl = dyn_cast<ClassDecl>(nominal);
2946-
TypeChecker::checkDistributedActor(decl);
2947-
}
2944+
if (nominal->isDistributedActor())
2945+
TypeChecker::checkDistributedActor(dyn_cast<ClassDecl>(nominal));
29482946
}
29492947

29502948
void visitTopLevelCodeDecl(TopLevelCodeDecl *TLCD) {

test/Distributed/Runtime/distributed_actor_deinit.swift

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,10 @@ struct ActorAddress: ActorIdentity {
6666
}
6767

6868
@available(SwiftStdlib 5.5, *)
69-
struct FakeTransport: ActorTransport {
69+
final class FakeTransport: @unchecked Sendable, ActorTransport {
70+
71+
var n = 0
72+
7073
func decodeIdentity(from decoder: Decoder) throws -> AnyActorIdentity {
7174
print("decode identity from:\(decoder)")
7275
fatalError("not implemented \(#function)")
@@ -80,7 +83,8 @@ struct FakeTransport: ActorTransport {
8083

8184
func assignIdentity<Act>(_ actorType: Act.Type) -> AnyActorIdentity
8285
where Act: DistributedActor {
83-
let address = ActorAddress(parse: "xxx")
86+
n += 1
87+
let address = ActorAddress(parse: "addr-\(n)")
8488
print("assign type:\(actorType), address:\(address)")
8589
return .init(address)
8690
}
@@ -99,7 +103,6 @@ struct FakeTransport: ActorTransport {
99103
@available(SwiftStdlib 5.5, *)
100104
func test() {
101105
let transport = FakeTransport()
102-
let address = ActorAddress(parse: "xxx")
103106

104107
// no lifecycle things make sense for a normal actor, double check we didn't emit them
105108
print("before A")
@@ -108,35 +111,44 @@ func test() {
108111
// CHECK: before A
109112
// CHECK: after A
110113

111-
_ = DA(transport: transport)
114+
_ = { () -> DA in
115+
DA(transport: transport)
116+
}()
112117
// CHECK: assign type:DA, address:[[ADDRESS:.*]]
113-
// CHECK: ready actor:main.DA, address:AnyActorIdentity(ActorAddress(address: "xxx"))
114-
// CHECK: resign address:AnyActorIdentity(ActorAddress(address: "xxx"))
118+
// CHECK: ready actor:main.DA, address:AnyActorIdentity(ActorAddress(address: "[[ADDR1:addr-[0-9]]]"))
119+
// CHECK: resign address:AnyActorIdentity(ActorAddress(address: "[[ADDR1]]"))
115120

116-
_ = DA_userDefined(transport: transport)
121+
_ = { () -> DA_userDefined in
122+
DA_userDefined(transport: transport)
123+
}()
117124
// CHECK: assign type:DA_userDefined, address:[[ADDRESS:.*]]
118-
// CHECK: ready actor:main.DA_userDefined, address:AnyActorIdentity(ActorAddress(address: "xxx"))
119-
// CHECK: resign address:AnyActorIdentity(ActorAddress(address: "xxx"))
125+
// CHECK: ready actor:main.DA_userDefined, address:AnyActorIdentity(ActorAddress(address: "[[ADDR2:addr-[0-9]]]"))
126+
// CHECK: resign address:AnyActorIdentity(ActorAddress(address: "[[ADDR2]]"))
120127

121128
// resign must happen as the _last thing_ after user-deinit completed
122-
_ = DA_userDefined2(transport: transport)
129+
_ = { () -> DA_userDefined2 in
130+
DA_userDefined2(transport: transport)
131+
}()
123132
// CHECK: assign type:DA_userDefined2, address:[[ADDRESS:.*]]
124-
// CHECK: ready actor:main.DA_userDefined2, address:AnyActorIdentity(ActorAddress(address: "xxx"))
125-
// CHECK: Deinitializing AnyActorIdentity(ActorAddress(address: "xxx"))
126-
// CHECK-NEXT: resign address:AnyActorIdentity(ActorAddress(address: "xxx"))
133+
// CHECK: ready actor:main.DA_userDefined2, address:AnyActorIdentity(ActorAddress(address: "[[ADDR3:addr-[0-9]]]"))
134+
// CHECK: Deinitializing AnyActorIdentity(ActorAddress(address: "[[ADDR3]]"))
135+
// CHECK-NEXT: resign address:AnyActorIdentity(ActorAddress(address: "[[ADDR3]]"))
127136

128137
// resign must happen as the _last thing_ after user-deinit completed
129-
_ = DA_state(transport: transport)
138+
_ = { () -> DA_state in
139+
DA_state(transport: transport)
140+
}()
130141
// CHECK: assign type:DA_state, address:[[ADDRESS:.*]]
131-
// CHECK: ready actor:main.DA_state, address:AnyActorIdentity(ActorAddress(address: "xxx"))
132-
// CHECK: Deinitializing AnyActorIdentity(ActorAddress(address: "xxx"))
133-
// CHECK-NEXT: resign address:AnyActorIdentity(ActorAddress(address: "xxx"))
142+
// CHECK: ready actor:main.DA_state, address:AnyActorIdentity(ActorAddress(address: "[[ADDR4:addr-[0-9]]]"))
143+
// CHECK: Deinitializing AnyActorIdentity(ActorAddress(address: "[[ADDR4]]"))
144+
// CHECK-NEXT: resign address:AnyActorIdentity(ActorAddress(address: "[[ADDR4]]"))
134145

135146
// a remote actor should not resign it's address, it was never "assigned" it
136-
print("before")
137-
_ = try! DA_userDefined2.resolve(.init(address), using: transport)
138-
// CHECK: before
139-
// CHECK-NEXT: resolve type:DA_userDefined2, address:AnyActorIdentity(ActorAddress(address: "xxx"))
147+
let address = ActorAddress(parse: "remote-1")
148+
_ = { () -> DA_userDefined2 in
149+
try! DA_userDefined2.resolve(.init(address), using: transport)
150+
}()
151+
// CHECK-NEXT: resolve type:DA_userDefined2, address:AnyActorIdentity(ActorAddress(address: "[[ADDR5:remote-1]]"))
140152
// CHECK-NEXT: Deinitializing
141153
}
142154

0 commit comments

Comments
 (0)