@@ -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