Skip to content

Commit 4a46717

Browse files
committed
Distributed: Fixes for non-copyable generics
1 parent 778e6d5 commit 4a46717

File tree

4 files changed

+51
-17
lines changed

4 files changed

+51
-17
lines changed

lib/AST/DistributedDecl.cpp

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -528,9 +528,13 @@ bool AbstractFunctionDecl::isDistributedActorSystemRemoteCall(bool isVoidReturn)
528528
}
529529

530530
auto sig = getGenericSignature();
531-
auto requirements = sig.getRequirements();
532531

533-
if (requirements.size() != expectedRequirementsNum) {
532+
SmallVector<Requirement, 2> reqs;
533+
SmallVector<InverseRequirement, 2> inverseReqs;
534+
sig->getRequirementsWithInverses(reqs, inverseReqs);
535+
assert(inverseReqs.empty() && "Non-copyable generics not supported here!");
536+
537+
if (reqs.size() != expectedRequirementsNum) {
534538
return false;
535539
}
536540

@@ -545,7 +549,7 @@ bool AbstractFunctionDecl::isDistributedActorSystemRemoteCall(bool isVoidReturn)
545549
// same_type: Act.ID FakeActorSystem.ActorID // LAST one
546550

547551
// --- Check requirement: conforms_to: Act DistributedActor
548-
auto actorReq = requirements[0];
552+
auto actorReq = reqs[0];
549553
if (actorReq.getKind() != RequirementKind::Conformance) {
550554
return false;
551555
}
@@ -554,7 +558,7 @@ bool AbstractFunctionDecl::isDistributedActorSystemRemoteCall(bool isVoidReturn)
554558
}
555559

556560
// --- Check requirement: conforms_to: Err Error
557-
auto errorReq = requirements[1];
561+
auto errorReq = reqs[1];
558562
if (errorReq.getKind() != RequirementKind::Conformance) {
559563
return false;
560564
}
@@ -593,7 +597,7 @@ bool AbstractFunctionDecl::isDistributedActorSystemRemoteCall(bool isVoidReturn)
593597
}
594598

595599
// -- Check requirement: same_type Actor.ID Self.ActorID
596-
auto actorIdReq = requirements.back();
600+
auto actorIdReq = reqs.back();
597601
if (actorIdReq.getKind() != RequirementKind::SameType) {
598602
return false;
599603
}
@@ -667,10 +671,14 @@ AbstractFunctionDecl::isDistributedTargetInvocationEncoderRecordGenericSubstitut
667671
return false;
668672
}
669673

674+
SmallVector<Requirement, 2> reqs;
675+
SmallVector<InverseRequirement, 2> inverseReqs;
676+
fd->getGenericSignature()->getRequirementsWithInverses(reqs, inverseReqs);
677+
assert(inverseReqs.empty() && "Non-copyable generics not supported here!");
678+
670679
// No requirements on the generic parameter
671-
if (fd->getGenericRequirements().size() != 0) {
680+
if (!reqs.empty())
672681
return false;
673-
}
674682

675683
if (!fd->getResultInterfaceType()->isVoid())
676684
return false;
@@ -785,9 +793,13 @@ AbstractFunctionDecl::isDistributedTargetInvocationEncoderRecordArgument() const
785793

786794

787795
auto sig = getGenericSignature();
788-
auto requirements = sig.getRequirements();
789796

790-
if (requirements.size() != expectedRequirementsNum) {
797+
SmallVector<Requirement, 2> reqs;
798+
SmallVector<InverseRequirement, 2> inverseReqs;
799+
sig->getRequirementsWithInverses(reqs, inverseReqs);
800+
assert(inverseReqs.empty() && "Non-copyable generics not supported here!");
801+
802+
if (reqs.size() != expectedRequirementsNum) {
791803
return false;
792804
}
793805

@@ -891,9 +903,13 @@ AbstractFunctionDecl::isDistributedTargetInvocationEncoderRecordReturnType() con
891903
GenericTypeParamDecl *ArgumentParam = genericParams->getParams()[0];
892904

893905
auto sig = getGenericSignature();
894-
auto requirements = sig.getRequirements();
895906

896-
if (requirements.size() != expectedRequirementsNum) {
907+
SmallVector<Requirement, 2> reqs;
908+
SmallVector<InverseRequirement, 2> inverseReqs;
909+
sig->getRequirementsWithInverses(reqs, inverseReqs);
910+
assert(inverseReqs.empty() && "Non-copyable generics not supported here!");
911+
912+
if (reqs.size() != expectedRequirementsNum) {
897913
return false;
898914
}
899915

@@ -1000,8 +1016,13 @@ AbstractFunctionDecl::isDistributedTargetInvocationEncoderRecordErrorType() cons
10001016

10011017
// --- Check: Argument: SerializationRequirement
10021018
auto sig = getGenericSignature();
1003-
auto requirements = sig.getRequirements();
1004-
if (requirements.size() != 1) {
1019+
1020+
SmallVector<Requirement, 2> reqs;
1021+
SmallVector<InverseRequirement, 2> inverseReqs;
1022+
sig->getRequirementsWithInverses(reqs, inverseReqs);
1023+
assert(inverseReqs.empty() && "Non-copyable generics not supported here!");
1024+
1025+
if (reqs.size() != 1) {
10051026
return false;
10061027
}
10071028

@@ -1016,7 +1037,7 @@ AbstractFunctionDecl::isDistributedTargetInvocationEncoderRecordErrorType() cons
10161037
}
10171038

10181039
// --- Check requirement: conforms_to: Err Error
1019-
auto errorReq = requirements[0];
1040+
auto errorReq = reqs[0];
10201041
if (errorReq.getKind() != RequirementKind::Conformance) {
10211042
return false;
10221043
}

lib/AST/Expr.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1315,6 +1315,9 @@ SequenceExpr *SequenceExpr::create(ASTContext &ctx, ArrayRef<Expr*> elements) {
13151315
ErasureExpr *ErasureExpr::create(ASTContext &ctx, Expr *subExpr, Type type,
13161316
ArrayRef<ProtocolConformanceRef> conformances,
13171317
ArrayRef<ConversionPair> argConversions) {
1318+
auto layout = type->getExistentialLayout();
1319+
assert(layout.getProtocols().size() == conformances.size());
1320+
13181321
auto size = totalSizeToAlloc<ProtocolConformanceRef, ConversionPair>(conformances.size(),
13191322
argConversions.size());
13201323
auto mem = ctx.Allocate(size, alignof(ErasureExpr));

lib/SILGen/SILGenDistributed.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,14 @@ void SILGenFunction::emitDistributedIfRemoteBranch(SILLocation Loc,
9898
assert(isRemoteFn && "Could not find 'is remote' function, is the "
9999
"'Distributed' module available?");
100100

101+
auto conformances = SGM.M.getSwiftModule()->collectExistentialConformances(
102+
selfTy->getCanonicalType(), ctx.getAnyObjectType());
103+
101104
ManagedValue selfAnyObject = B.createInitExistentialRef(
102105
Loc,
103106
/*existentialType=*/getLoweredType(ctx.getAnyObjectType()),
104-
/*formalConcreteType=*/selfValue.getType().getASTType(),
105-
selfValue, {});
107+
/*formalConcreteType=*/selfTy->getCanonicalType(),
108+
selfValue, conformances);
106109
auto result = emitApplyOfLibraryIntrinsic(
107110
Loc, isRemoteFn, SubstitutionMap(), {selfAnyObject}, SGFContext());
108111

lib/Sema/DerivedConformanceDistributedActor.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -645,6 +645,8 @@ deriveBodyDistributedActor_unownedExecutor(AbstractFunctionDecl *getter, void *)
645645
// }
646646
ASTContext &ctx = getter->getASTContext();
647647

648+
auto *module = getter->getParentModule();
649+
648650
// Produce an empty brace statement on failure.
649651
auto failure = [&]() -> std::pair<BraceStmt *, bool> {
650652
auto body = BraceStmt::create(
@@ -680,9 +682,14 @@ deriveBodyDistributedActor_unownedExecutor(AbstractFunctionDecl *getter, void *)
680682
ctx.getBoolType()));
681683
Expr *selfForIsLocalArg = DerivedConformance::createSelfDeclRef(getter);
682684
selfForIsLocalArg->setType(selfType);
685+
686+
auto conformances = module->collectExistentialConformances(selfType->getCanonicalType(),
687+
ctx.getAnyObjectType());
683688
auto *argListForIsLocal =
684689
ArgumentList::forImplicitSingle(ctx, Identifier(),
685-
ErasureExpr::create(ctx, selfForIsLocalArg, ctx.getAnyObjectType(), {}, {}));
690+
ErasureExpr::create(ctx, selfForIsLocalArg,
691+
ctx.getAnyObjectType(),
692+
conformances, {}));
686693
CallExpr *isLocalActorCall = CallExpr::createImplicit(ctx, isLocalActorExpr, argListForIsLocal);
687694
isLocalActorCall->setType(ctx.getBoolType());
688695
isLocalActorCall->setThrows(nullptr);

0 commit comments

Comments
 (0)