Skip to content

Commit 0a54d5e

Browse files
committed
[Concurrency] guard diagnosis from case where Job decl might be null
1 parent dfb1a4a commit 0a54d5e

File tree

1 file changed

+19
-15
lines changed

1 file changed

+19
-15
lines changed

lib/Sema/TypeCheckConcurrency.cpp

+19-15
Original file line numberDiff line numberDiff line change
@@ -1272,7 +1272,8 @@ void swift::tryDiagnoseExecutorConformance(ASTContext &C,
12721272
if (funcDecl->getParameters()->size() != 1)
12731273
continue;
12741274
if (auto param = funcDecl->getParameters()->front()) {
1275-
if (param->getType()->isEqual(C.getJobDecl()->getDeclaredInterfaceType())) {
1275+
if (C.getJobDecl() &&
1276+
param->getType()->isEqual(C.getJobDecl()->getDeclaredInterfaceType())) {
12761277
assert(moveOnlyEnqueueRequirement == nullptr);
12771278
moveOnlyEnqueueRequirement = funcDecl;
12781279
} else if (param->getType()->isEqual(C.getUnownedJobDecl()->getDeclaredInterfaceType())) {
@@ -1289,8 +1290,8 @@ void swift::tryDiagnoseExecutorConformance(ASTContext &C,
12891290

12901291
auto conformance = module->lookupConformance(nominalTy, proto);
12911292
auto concreteConformance = conformance.getConcrete();
1292-
auto unownedEnqueueWitness = concreteConformance->getWitnessDeclRef(unownedEnqueueRequirement);
1293-
auto moveOnlyEnqueueWitness = concreteConformance->getWitnessDeclRef(moveOnlyEnqueueRequirement);
1293+
assert(unownedEnqueueRequirement && "could not find the enqueue(UnownedJob) requirement, which should be always there");
1294+
ConcreteDeclRef unownedEnqueueWitness = concreteConformance->getWitnessDeclRef(unownedEnqueueRequirement);
12941295

12951296
if (auto enqueueUnownedDecl = unownedEnqueueWitness.getDecl()) {
12961297
// Old UnownedJob based impl is present, warn about it suggesting the new protocol requirement.
@@ -1300,18 +1301,21 @@ void swift::tryDiagnoseExecutorConformance(ASTContext &C,
13001301
}
13011302

13021303
if (auto unownedEnqueueDecl = unownedEnqueueWitness.getDecl()) {
1303-
if (auto moveOnlyEnqueueDecl = moveOnlyEnqueueWitness.getDecl()) {
1304-
if (unownedEnqueueDecl && unownedEnqueueDecl->getLoc().isInvalid() &&
1305-
moveOnlyEnqueueDecl && moveOnlyEnqueueDecl->getLoc().isInvalid()) {
1306-
// Neither old nor new implementation have been found, but we provide default impls for them
1307-
// that are mutually recursive, so we must error and suggest implementing the right requirement.
1308-
auto ownedRequirement = C.getExecutorDecl()->getExecutorOwnedEnqueueFunction();
1309-
nominal->diagnose(diag::type_does_not_conform, nominalTy, proto->getDeclaredInterfaceType());
1310-
ownedRequirement->diagnose(diag::no_witnesses,
1311-
getProtocolRequirementKind(ownedRequirement),
1312-
ownedRequirement->getName(),
1313-
proto->getDeclaredInterfaceType(),
1314-
/*AddFixIt=*/true);
1304+
if (moveOnlyEnqueueRequirement) {
1305+
ConcreteDeclRef moveOnlyEnqueueWitness = concreteConformance->getWitnessDeclRef(moveOnlyEnqueueRequirement);
1306+
if (auto moveOnlyEnqueueDecl = moveOnlyEnqueueWitness.getDecl()) {
1307+
if (unownedEnqueueDecl && unownedEnqueueDecl->getLoc().isInvalid() &&
1308+
moveOnlyEnqueueDecl && moveOnlyEnqueueDecl->getLoc().isInvalid()) {
1309+
// Neither old nor new implementation have been found, but we provide default impls for them
1310+
// that are mutually recursive, so we must error and suggest implementing the right requirement.
1311+
auto ownedRequirement = C.getExecutorDecl()->getExecutorOwnedEnqueueFunction();
1312+
nominal->diagnose(diag::type_does_not_conform, nominalTy, proto->getDeclaredInterfaceType());
1313+
ownedRequirement->diagnose(diag::no_witnesses,
1314+
getProtocolRequirementKind(ownedRequirement),
1315+
ownedRequirement->getName(),
1316+
proto->getDeclaredInterfaceType(),
1317+
/*AddFixIt=*/true);
1318+
}
13151319
}
13161320
}
13171321
}

0 commit comments

Comments
 (0)