Skip to content

Commit 6008b32

Browse files
ktosodrexinkavonDougGregor
authored
[Distributed] initial distributed support, fixed availability (#37650)
* [Distributed] Initial distributed checking * [Distributed] initial types shapes and conform to DistributedActor * [Distributed] Require Codable params and return types * [Distributed] initial synthesis of fields and constructors * [Distributed] Field and initializer synthesis * [Distributed] Codable requirement on distributed funcs; also handle <T: Codable> * [Distributed] handle generic type params which are Codable in dist func [Distributed] conformsToProtocol after all * [Distributed] Implement remote flag on actors * Implement remote flag on actors * add test * actor initializer that sets remote flag [Distributed] conformances getting there * [Distributed] dont require async throws; cleanup compile tests * [Distributed] do not synthesize default implicit init, only our special ones * [Distributed] properly synth inits and properties; mark actorTransport as _distributedActorIndependent Also: - do not synthesize default init() initializer for dist actor * [Distributed] init(transport:) designated and typechecking * [Distributed] dist actor initializers MUST delegate to local-init * [Distributed] check if any ctors in delegation call init(transport:) * [Distributed] check init(transport:) delegation through many inits; ban invoking init(resolve:using:) explicitly * [Distributed] disable IRGen test for now * [Distributed] Rebase cleanups * [Concurrent] transport and address are concurrent value * [Distributed] introduce -enable-experimental-distributed flag * rebase adjustments again * rebase again... * [Distributed] distributed functions are implicitly async+throws outside the actor * [Distributed] implicitly throwing and async distributed funcs * remove printlns * add more checks to implicit function test * [Distributed] resolve initializer now marks the isRemote actor flag * [Distributed] distributedActor_destroy invoked instead, rather than before normal * [Distributed] Generate distributed thunk for actors * [distributed] typechecking for _remote_ functions existing, add tests for remote funcs * adding one XFAIL'ed task & actor lifetime test The `executor_deinit1` test fails 100% of the time (from what I've seen) so I thought we could track and see when/if someone happens to fix this bug. Also, added extra coverage for #36298 via `executor_deinit2` * Fix a memory issue with actors in the runtime system, by @phausler * add new test that now passes because of patch by @phausler See previous commit in this PR. Test is based on one from rdar://74281361 * fix all tests that require the _remote_ function stubs * Do not infer @actorIndependent onto `let` decls * REVERT_ME: remove some tests that hacky workarounds will fail * another flaky test, help build toolchain * [Distributed] experimental distributed implies experimental concurrency * [Distributed] Allow distributed function that are not marked async or throws * [Distributed] make attrs SIMPLE to get serialization generated * [Distributed] ActorAddress must be Hashable * [Distributed] Implement transport.actorReady call in local init * cleanup after rebase * [Distributed] add availability attributes to all distributed actor code * cleanup - this fixed some things * fixing up * fixing up * [Distributed] introduce new Distributed module * [Distributed] diagnose when missing 'import _Distributed' * [Distributed] make all tests import the module * more docs on address * [Distributed] fixup merge issues * cleanup: remove unnecessary code for now SIMPLE attribute * fix: fix getActorIsolationOfContext * [Distributed] cmake: depend on _concurrency module * fixing tests... * Revert "another flaky test, help build toolchain" This reverts commit 83ae665. * remove xfail * clenup some IR and SIL tests * cleanup * [Distributed] fix cmake test and ScanDependencies/can_import_with_map.swift * [Distributed] fix flags/build tests * cleanup: use isDistributed wherever possible * [Distributed] don't import Dispatch in tests * dont link distributed in stdlib unittest * trying always append distributed module * cleanups * [Distributed] move all tests to Distributed/ directory * [lit] try to fix lit test discovery * [Distributed] update tests after diagnostics for implicit async changed * [Distributed] Disable remote func tests on Windows for now * Review cleanups * [Distributed] fix typo, fixes Concurrency/actor_isolation_objc.swift * [Distributed] attributes are DistributedOnly (only) * cleanup * [Distributed] cleanup: rely on DistributedOnly for guarding the keyword * Update include/swift/AST/ActorIsolation.h Co-authored-by: Doug Gregor <[email protected]> * introduce isAnyThunk, minor cleanup * wip * [Distributed] move some type checking to TypeCheckDistributed.cpp * [TypeCheckAttr] remove extra debug info * [Distributed/AutoDiff] fix SILDeclRef creation which caused AutoDiff issue * cleanups * [lit] remove json import from lit test suite, not needed after all * [Distributed] distributed functions only in DistributedActor protocols * [Distributed] fix flag overlap & build setting * [Distributed] Simplify noteIsolatedActorMember to not take bool distributed param * [Distributed] make __isRemote not public * [Distributed] Fix availability and remove actor class tests * [actorIndependent] do not apply actorIndependent implicitly to values where it would be illegal to apply * [Distributed] disable tests until issue fixed Co-authored-by: Dario Rexin <[email protected]> Co-authored-by: Kavon Farvardin <[email protected]> Co-authored-by: Doug Gregor <[email protected]>
1 parent a0b1c0b commit 6008b32

File tree

120 files changed

+4041
-117
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

120 files changed

+4041
-117
lines changed

CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,10 @@ option(SWIFT_ENABLE_EXPERIMENTAL_CONCURRENCY
418418
"Enable experimental Swift concurrency model"
419419
FALSE)
420420

421+
option(SWIFT_ENABLE_EXPERIMENTAL_DISTRIBUTED
422+
"Enable experimental distributed actors and functions"
423+
FALSE)
424+
421425
option(SWIFT_ENABLE_DISPATCH
422426
"Enable use of libdispatch"
423427
TRUE)
@@ -901,6 +905,7 @@ if(SWIFT_BUILD_STDLIB OR SWIFT_BUILD_SDK_OVERLAY)
901905

902906
message(STATUS "Differentiable Programming Support: ${SWIFT_ENABLE_EXPERIMENTAL_DIFFERENTIABLE_PROGRAMMING}")
903907
message(STATUS "Concurrency Support: ${SWIFT_ENABLE_EXPERIMENTAL_CONCURRENCY}")
908+
message(STATUS "Distributed Support: ${SWIFT_ENABLE_EXPERIMENTAL_DISTRIBUTED}")
904909
message(STATUS "")
905910
else()
906911
message(STATUS "Not building Swift standard library, SDK overlays, and runtime")

include/swift/AST/ASTMangler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ class ASTMangler : public Mangler {
8888
DynamicThunk,
8989
SwiftAsObjCThunk,
9090
ObjCAsSwiftThunk,
91+
DistributedThunk,
9192
};
9293

9394
ASTMangler(bool DWARFMangling = false)

include/swift/AST/ActorIsolation.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ class ActorIsolation {
4848
/// For example, a mutable stored property or synchronous function within
4949
/// the actor is isolated to the instance of that actor.
5050
ActorInstance,
51+
/// The declaration is isolated to a (potentially) distributed actor.
52+
/// Distributed actors may access _their_ state (same as 'ActorInstance')
53+
/// however others may not access any properties on other distributed actors.
54+
DistributedActorInstance,
5155
/// The declaration is explicitly specified to be independent of any actor,
5256
/// meaning that it can be used from any actor but is also unable to
5357
/// refer to the isolated state of any given actor.
@@ -88,6 +92,10 @@ class ActorIsolation {
8892
return ActorIsolation(ActorInstance, actor);
8993
}
9094

95+
static ActorIsolation forDistributedActorInstance(NominalTypeDecl *actor) {
96+
return ActorIsolation(DistributedActorInstance, actor);
97+
}
98+
9199
static ActorIsolation forGlobalActor(Type globalActor, bool unsafe) {
92100
return ActorIsolation(
93101
unsafe ? GlobalActorUnsafe : GlobalActor, globalActor);
@@ -100,7 +108,7 @@ class ActorIsolation {
100108
bool isUnspecified() const { return kind == Unspecified; }
101109

102110
NominalTypeDecl *getActor() const {
103-
assert(getKind() == ActorInstance);
111+
assert(getKind() == ActorInstance || getKind() == DistributedActorInstance);
104112
return actor;
105113
}
106114

@@ -131,6 +139,7 @@ class ActorIsolation {
131139
return true;
132140

133141
case ActorInstance:
142+
case DistributedActorInstance:
134143
return lhs.actor == rhs.actor;
135144

136145
case GlobalActor:

include/swift/AST/Attr.def

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,21 @@ CONTEXTUAL_SIMPLE_DECL_ATTR(spawn, Spawn,
659659
APIBreakingToAdd | APIBreakingToRemove,
660660
117)
661661

662+
CONTEXTUAL_SIMPLE_DECL_ATTR(distributed, DistributedActor,
663+
DeclModifier | OnClass | OnFunc |
664+
DistributedOnly |
665+
ABIBreakingToAdd | ABIBreakingToRemove |
666+
APIBreakingToAdd | APIBreakingToRemove,
667+
118)
668+
669+
SIMPLE_DECL_ATTR(_distributedActorIndependent, DistributedActorIndependent,
670+
OnFunc | OnVar |
671+
DistributedOnly | UserInaccessible |
672+
ABIStableToAdd | ABIStableToRemove |
673+
APIBreakingToAdd | APIBreakingToRemove,
674+
119)
675+
676+
662677
#undef TYPE_ATTR
663678
#undef DECL_ATTR_ALIAS
664679
#undef CONTEXTUAL_DECL_ATTR_ALIAS

include/swift/AST/Attr.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,9 @@ class DeclAttribute : public AttributeBase {
298298

299299
/// Whether this attribute is only valid when concurrency is enabled.
300300
ConcurrencyOnly = 1ull << (unsigned(DeclKindIndex::Last_Decl) + 16),
301+
302+
/// Whether this attribute is only valid when distributed is enabled.
303+
DistributedOnly = 1ull << (unsigned(DeclKindIndex::Last_Decl) + 17),
301304
};
302305

303306
LLVM_READNONE
@@ -392,6 +395,10 @@ class DeclAttribute : public AttributeBase {
392395
return getOptions(DK) & ConcurrencyOnly;
393396
}
394397

398+
static bool isDistributedOnly(DeclAttrKind DK) {
399+
return getOptions(DK) & DistributedOnly;
400+
}
401+
395402
static bool isUserInaccessible(DeclAttrKind DK) {
396403
return getOptions(DK) & UserInaccessible;
397404
}

include/swift/AST/Builtins.def

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -724,6 +724,14 @@ BUILTIN_MISC_OPERATION(InitializeDefaultActor, "initializeDefaultActor", "", Spe
724724
/// Destroy the default-actor instance in a default actor object.
725725
BUILTIN_MISC_OPERATION(DestroyDefaultActor, "destroyDefaultActor", "", Special)
726726

727+
/// Initialize a "proxy" for a distributed remote actor.
728+
BUILTIN_MISC_OPERATION(InitializeDistributedRemoteActor,
729+
"initializeDistributedRemoteActor", "", Special)
730+
731+
/// Destroy the distributed-actor instance in a "proxy" actor object.
732+
BUILTIN_MISC_OPERATION(DestroyDistributedActor,
733+
"destroyDistributedActor", "", Special)
734+
727735
/// Resume a non-throwing continuation normally with the given result.
728736
BUILTIN_MISC_OPERATION(ResumeNonThrowingContinuationReturning,
729737
"resumeNonThrowingContinuationReturning", "", Special)

include/swift/AST/Decl.h

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2346,6 +2346,8 @@ class ValueDecl : public Decl {
23462346
/// Is this declaration marked with 'dynamic'?
23472347
bool isDynamic() const;
23482348

2349+
bool isDistributedActorIndependent() const;
2350+
23492351
private:
23502352
bool isObjCDynamic() const {
23512353
return isObjC() && isDynamic();
@@ -3164,6 +3166,11 @@ class NominalTypeDecl : public GenericTypeDecl, public IterableDeclContext {
31643166
OptionSet<LookupDirectFlags> flags =
31653167
OptionSet<LookupDirectFlags>());
31663168

3169+
/// Find the '_remote_<...>' counterpart function to a 'distributed func'.
3170+
///
3171+
/// If the passed in function is not distributed this function returns null.
3172+
AbstractFunctionDecl* lookupDirectRemoteFunc(AbstractFunctionDecl *func);
3173+
31673174
/// Collect the set of protocols to which this type should implicitly
31683175
/// conform, such as AnyObject (for classes).
31693176
void getImplicitProtocols(SmallVectorImpl<ProtocolDecl *> &protocols);
@@ -3220,6 +3227,10 @@ class NominalTypeDecl : public GenericTypeDecl, public IterableDeclContext {
32203227
/// `Actor` protocol.
32213228
bool isActor() const;
32223229

3230+
/// Whether this nominal type qualifies as a distributed actor, meaning that
3231+
/// it is either a distributed actor.
3232+
bool isDistributedActor() const;
3233+
32233234
/// Return the range of semantics attributes attached to this NominalTypeDecl.
32243235
auto getSemanticsAttrs() const
32253236
-> decltype(getAttrs().getSemanticsAttrs()) {
@@ -3288,6 +3299,8 @@ class NominalTypeDecl : public GenericTypeDecl, public IterableDeclContext {
32883299
/// for types that are not global actors.
32893300
VarDecl *getGlobalActorInstance() const;
32903301

3302+
bool hasDistributedActorLocalInitializer() const;
3303+
32913304
/// Whether this type is a global actor, which can be used as an
32923305
/// attribute to decorate declarations for inclusion in the actor-isolated
32933306
/// state denoted by this type.
@@ -4003,6 +4016,7 @@ enum class KnownDerivableProtocolKind : uint8_t {
40034016
AdditiveArithmetic,
40044017
Differentiable,
40054018
Actor,
4019+
DistributedActor,
40064020
};
40074021

40084022
/// ProtocolDecl - A declaration of a protocol, for example:
@@ -4196,6 +4210,10 @@ class ProtocolDecl final : public NominalTypeDecl {
41964210
/// semantics but has no corresponding witness table.
41974211
bool isMarkerProtocol() const;
41984212

4213+
/// Is a protocol that can only be conformed by distributed actors.
4214+
/// Such protocols are allowed to contain distributed functions.
4215+
bool inheritsFromDistributedActor() const;
4216+
41994217
private:
42004218
void computeKnownProtocolKind() const;
42014219

@@ -4714,6 +4732,8 @@ class AbstractStorageDecl : public ValueDecl {
47144732

47154733
bool hasAnyNativeDynamicAccessors() const;
47164734

4735+
bool isDistributedActorIndependent() const;
4736+
47174737
// Implement isa/cast/dyncast/etc.
47184738
static bool classof(const Decl *D) {
47194739
return D->getKind() >= DeclKind::First_AbstractStorageDecl &&
@@ -5170,14 +5190,20 @@ class VarDecl : public AbstractStorageDecl {
51705190
return getAttrs().getAttributes<SemanticsAttr>();
51715191
}
51725192

5173-
/// Returns true if this VarDelc has the string \p attrValue as a semantics
5193+
/// Returns true if this VarDecl has the string \p attrValue as a semantics
51745194
/// attribute.
51755195
bool hasSemanticsAttr(StringRef attrValue) const {
51765196
return llvm::any_of(getSemanticsAttrs(), [&](const SemanticsAttr *attr) {
51775197
return attrValue.equals(attr->Value);
51785198
});
51795199
}
51805200

5201+
/// Whether the given name is actorAddress, which is used for distributed actors.
5202+
static bool isDistributedActorAddressName(ASTContext &ctx, DeclName name);
5203+
5204+
/// Whether the given name is actorTransport, which is used for distributed actors.
5205+
static bool isDistributedActorTransportName(ASTContext &ctx, DeclName name);
5206+
51815207
// Implement isa/cast/dyncast/etc.
51825208
static bool classof(const Decl *D) {
51835209
return D->getKind() == DeclKind::Var || D->getKind() == DeclKind::Param;
@@ -5855,6 +5881,9 @@ class AbstractFunctionDecl : public GenericContext, public ValueDecl {
58555881
/// Returns if the function is 'rethrows' or 'reasync'.
58565882
bool hasPolymorphicEffect(EffectKind kind) const;
58575883

5884+
/// Returns 'true' if the function is distributed.
5885+
bool isDistributed() const;
5886+
58585887
PolymorphicEffectKind getPolymorphicEffectKind(EffectKind kind) const;
58595888

58605889
// FIXME: Hack that provides names with keyword arguments for accessors.
@@ -6864,6 +6893,18 @@ class ConstructorDecl : public AbstractFunctionDecl {
68646893
/// \endcode
68656894
bool isObjCZeroParameterWithLongSelector() const;
68666895

6896+
/// Checks if the initializer is a distributed actor's 'local' initializer:
6897+
/// ```
6898+
/// init(transport: ActorTransport)
6899+
/// ```
6900+
bool isDistributedActorLocalInit() const;
6901+
6902+
/// Checks if the initializer is a distributed actor's 'resolve' initializer:
6903+
/// ```
6904+
/// init(resolve address: ActorAddress, using transport: ActorTransport)
6905+
/// ```
6906+
bool isDistributedActorResolveInit() const;
6907+
68676908
static bool classof(const Decl *D) {
68686909
return D->getKind() == DeclKind::Constructor;
68696910
}

include/swift/AST/DiagnosticsParse.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1822,7 +1822,7 @@ ERROR(pound_available_package_description_not_allowed, none,
18221822
ERROR(availability_query_repeated_platform, none,
18231823
"version for '%0' already specified", (StringRef))
18241824

1825-
ERROR(attr_requires_concurrency,none,
1825+
ERROR(attr_requires_concurrency, none,
18261826
"'%0' %select{attribute|modifier}1 is only valid when experimental "
18271827
"concurrency is enabled",
18281828
(StringRef, bool))

include/swift/AST/DiagnosticsSema.def

Lines changed: 89 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4360,6 +4360,13 @@ ERROR(actor_isolated_non_self_reference,none,
43604360
"actor-isolated %0 %1 can only be %select{referenced|mutated|used 'inout'}3 "
43614361
"%select{from inside the actor|on 'self'}2",
43624362
(DescriptiveDeclKind, DeclName, bool, unsigned))
4363+
ERROR(distributed_actor_isolated_non_self_reference,none,
4364+
"distributed actor-isolated %0 %1 can only be referenced "
4365+
"inside the distributed actor",
4366+
(DescriptiveDeclKind, DeclName))
4367+
ERROR(distributed_actor_needs_explicit_distributed_import,none,
4368+
"'_Distributed' module not imported, required for 'distributed actor'",
4369+
())
43634370
ERROR(actor_isolated_self_independent_context,none,
43644371
"actor-isolated %0 %1 can not be %select{referenced|mutated|used 'inout'}2 from a "
43654372
"non-isolated context",
@@ -4409,8 +4416,8 @@ ERROR(actor_isolated_from_async_let,none,
44094416
"actor-isolated %0 %1 cannot be %select{referenced|mutated|used 'inout'}2 from 'async let' initializer",
44104417
(DescriptiveDeclKind, DeclName, unsigned))
44114418
ERROR(actor_isolated_keypath_component,none,
4412-
"cannot form key path to actor-isolated %0 %1",
4413-
(DescriptiveDeclKind, DeclName))
4419+
"cannot form key path to%select{| distributed}0 actor-isolated %1 %2",
4420+
(bool, DescriptiveDeclKind, DeclName))
44144421
ERROR(effectful_keypath_component,none,
44154422
"cannot form key path to %0 with 'throws' or 'async'",
44164423
(DescriptiveDeclKind))
@@ -4425,6 +4432,32 @@ NOTE(actor_isolated_sync_func,none,
44254432
"calls to %0 %1 from outside of its actor context are "
44264433
"implicitly asynchronous",
44274434
(DescriptiveDeclKind, DeclName))
4435+
NOTE(distributed_actor_isolated_method_note,none,
4436+
"only 'distributed' functions can be called from outside the distributed actor",
4437+
())
4438+
ERROR(distributed_actor_isolated_method,none,
4439+
"only 'distributed' functions can be called from outside the distributed actor", // TODO: more like 'non-distributed' ... defined here
4440+
())
4441+
ERROR(distributed_actor_func_param_not_codable,none,
4442+
"distributed function parameter '%0' of type %1 does not conform to 'Codable'",
4443+
(StringRef, Type))
4444+
ERROR(distributed_actor_func_result_not_codable,none,
4445+
"distributed function result type %0 does not conform to 'Codable'",
4446+
(Type))
4447+
ERROR(distributed_actor_func_missing_remote_func,none,
4448+
"distributed function is missing its remote static func implementation (%0). "
4449+
"You may want to use a distributed actor SwiftPM plugin to generate those, "
4450+
"or implement it manually.",
4451+
(Identifier))
4452+
ERROR(distributed_actor_remote_func_is_not_static,none,
4453+
"remote function %0 must be static.",
4454+
(DeclName))
4455+
ERROR(distributed_actor_remote_func_is_not_async_throws,none,
4456+
"remote function %0 must be 'async throws'.",
4457+
(DeclName))
4458+
ERROR(distributed_actor_remote_func_must_not_be_distributed,none,
4459+
"remote function %0 must be 'async throws'.",
4460+
(DeclName))
44284461
NOTE(actor_mutable_state,none,
44294462
"mutation of this %0 is only permitted within the actor",
44304463
(DescriptiveDeclKind))
@@ -4514,6 +4547,60 @@ ERROR(actor_instance_property_wrapper,none,
45144547
"the actor instance; consider 'nonisolated'",
45154548
(Identifier, Identifier))
45164549

4550+
ERROR(distributed_actor_func_defined_outside_of_distributed_actor,none,
4551+
"distributed function %0 is declared outside of an distributed actor",
4552+
(DeclName))
4553+
ERROR(distributed_actor_local_init_explicitly_defined,none,
4554+
"'distributed actor' local-initializer 'init(transport:)' "
4555+
"cannot be implemented explicitly.",
4556+
())
4557+
ERROR(distributed_actor_init_resolve_must_not_be_user_defined,none,
4558+
"'distributed actor' resolve-initializer 'init(resolve:using:)' "
4559+
"cannot be implemented explicitly.",
4560+
())
4561+
ERROR(distributed_actor_init_user_defined_must_be_convenience,none,
4562+
"'distributed actor' initializer %0 must be 'convenience' initializer. "
4563+
"Distributed actors have an implicitly synthesized designated "
4564+
"'init(transport:)' local-initializer, which other initializers must delegate to",
4565+
(DeclName))
4566+
ERROR(distributed_actor_init_must_delegate_to_local_init,none,
4567+
"'distributed actor' initializer %0 must (directly or indirectly) delegate "
4568+
"to 'init(transport:)'",
4569+
(DeclName))
4570+
ERROR(distributed_actor_init_must_not_delegate_to_resolve_init,none,
4571+
"'distributed actor' initializer %0 cannot delegate to resolve-initializer "
4572+
"'init(resolve:using:)', as it may result resolving a storageless proxy instance",
4573+
(DeclName))
4574+
ERROR(distributed_actor_local_var,none,
4575+
"'distributed' can not be applied to local variables",
4576+
())
4577+
ERROR(distributed_actor_property,none,
4578+
"'distributed' can not be applied to local properties",
4579+
())
4580+
ERROR(distributed_actor_storage,none,
4581+
"'distributed' can not be applied to actor properties; "
4582+
"Only functions can be 'distributed'",
4583+
())
4584+
ERROR(distributed_actor_not_actor,none,
4585+
"'distributed' can only be applied to 'actor' definitions, "
4586+
"and distributed actor-isolated async functions",
4587+
())
4588+
ERROR(distributed_actor_not_actor_func,none,
4589+
"'distributed' can only be applied to distributed actor async functions",
4590+
())
4591+
ERROR(distributed_actor_func_static,none,
4592+
"'distributed' functions cannot be 'static'",
4593+
())
4594+
ERROR(distributed_actor_func_not_in_distributed_actor,none,
4595+
"'distributed' function can only be declared within 'distributed actor'",
4596+
())
4597+
ERROR(distributed_actor_independent_property_must_be_let,none,
4598+
"_distributedActorIndependent can be applied to properties, however they must be 'let'",
4599+
())
4600+
NOTE(distributed_actor_isolated_property,none,
4601+
"distributed actor state is only available within the actor instance",
4602+
())
4603+
45174604
ERROR(concurrency_lib_missing,none,
45184605
"missing '%0' declaration, probably because the '_Concurrency' "
45194606
"module was not imported", (StringRef))

0 commit comments

Comments
 (0)