[Concurrency] Teach the constraint system about .isolation on dynamically

isolated function values.
This commit is contained in:
Holly Borla
2024-03-13 19:54:37 -07:00
parent 78384d596d
commit d9aa8697ab
9 changed files with 52 additions and 1 deletions

View File

@@ -205,6 +205,7 @@ static bool areConservativelyCompatibleArgumentLabels(
case OverloadChoiceKind::KeyPathDynamicMemberLookup:
case OverloadChoiceKind::TupleIndex:
case OverloadChoiceKind::MaterializePack:
case OverloadChoiceKind::ExtractFunctionIsolation:
return true;
}
@@ -9746,6 +9747,16 @@ performMemberLookup(ConstraintKind constraintKind, DeclNameRef memberName,
if (auto *selfTy = instanceTy->getAs<DynamicSelfType>())
instanceTy = selfTy->getSelfType();
// Dynamically isolated function types have a magic '.isolation'
// member that extracts the isolation value.
if (auto *fn = dyn_cast<FunctionType>(instanceTy)) {
if (fn->getIsolation().isErased() &&
memberName.getBaseIdentifier().str() == "isolation") {
result.ViableCandidates.push_back(
OverloadChoice(baseTy, OverloadChoiceKind::ExtractFunctionIsolation));
}
}
if (!instanceTy->mayHaveMembers())
return result;