@@ -1658,6 +1658,48 @@ void TypeChecker::diagnosePotentialOpaqueTypeUnavailability(
16581658 fixAvailability (ReferenceRange, ReferenceDC, RequiredRange, Context);
16591659}
16601660
1661+ static void diagnosePotentialConcurrencyUnavailability (
1662+ SourceRange ReferenceRange, const DeclContext *ReferenceDC,
1663+ const UnavailabilityReason &Reason) {
1664+ ASTContext &Context = ReferenceDC->getASTContext ();
1665+
1666+ auto RequiredRange = Reason.getRequiredOSVersionRange ();
1667+ {
1668+ auto Err =
1669+ Context.Diags .diagnose (
1670+ ReferenceRange.Start ,
1671+ diag::availability_concurrency_only_version_newer,
1672+ prettyPlatformString (targetPlatform (Context.LangOpts )),
1673+ Reason.getRequiredOSVersionRange ().getLowerEndpoint ());
1674+
1675+ // Direct a fixit to the error if an existing guard is nearly-correct
1676+ if (fixAvailabilityByNarrowingNearbyVersionCheck (ReferenceRange,
1677+ ReferenceDC,
1678+ RequiredRange, Context, Err))
1679+ return ;
1680+ }
1681+ fixAvailability (ReferenceRange, ReferenceDC, RequiredRange, Context);
1682+ }
1683+
1684+
1685+ void TypeChecker::checkConcurrencyAvailability (SourceRange ReferenceRange,
1686+ const DeclContext *ReferenceDC) {
1687+ // Check the availability of concurrency runtime support.
1688+ ASTContext &ctx = ReferenceDC->getASTContext ();
1689+ if (ctx.LangOpts .DisableAvailabilityChecking )
1690+ return ;
1691+
1692+ auto runningOS =
1693+ TypeChecker::overApproximateAvailabilityAtLocation (
1694+ ReferenceRange.Start , ReferenceDC);
1695+ auto availability = ctx.getConcurrencyAvailability ();
1696+ if (!runningOS.isContainedIn (availability)) {
1697+ diagnosePotentialConcurrencyUnavailability (
1698+ ReferenceRange, ReferenceDC,
1699+ UnavailabilityReason::requiresVersionRange (availability.getOSVersion ()));
1700+ }
1701+ }
1702+
16611703void TypeChecker::diagnosePotentialUnavailability (
16621704 const ValueDecl *D, SourceRange ReferenceRange,
16631705 const DeclContext *ReferenceDC,
0 commit comments