@@ -1272,7 +1272,8 @@ void swift::tryDiagnoseExecutorConformance(ASTContext &C,
1272
1272
if (funcDecl->getParameters ()->size () != 1 )
1273
1273
continue ;
1274
1274
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 ())) {
1276
1277
assert (moveOnlyEnqueueRequirement == nullptr );
1277
1278
moveOnlyEnqueueRequirement = funcDecl;
1278
1279
} else if (param->getType ()->isEqual (C.getUnownedJobDecl ()->getDeclaredInterfaceType ())) {
@@ -1289,8 +1290,8 @@ void swift::tryDiagnoseExecutorConformance(ASTContext &C,
1289
1290
1290
1291
auto conformance = module->lookupConformance (nominalTy, proto);
1291
1292
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 );
1294
1295
1295
1296
if (auto enqueueUnownedDecl = unownedEnqueueWitness.getDecl ()) {
1296
1297
// Old UnownedJob based impl is present, warn about it suggesting the new protocol requirement.
@@ -1300,18 +1301,21 @@ void swift::tryDiagnoseExecutorConformance(ASTContext &C,
1300
1301
}
1301
1302
1302
1303
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
+ }
1315
1319
}
1316
1320
}
1317
1321
}
0 commit comments