diff --git a/include/swift/AST/ASTContext.h b/include/swift/AST/ASTContext.h index 2dfb3ac43d48e..efe03267fa9c0 100644 --- a/include/swift/AST/ASTContext.h +++ b/include/swift/AST/ASTContext.h @@ -738,6 +738,9 @@ class ASTContext final { /// Get the runtime availability of support for concurrency. AvailabilityContext getConcurrencyAvailability(); + /// Get the back-deployed availability for concurrency. + AvailabilityContext getBackDeployedConcurrencyAvailability(); + /// Get the runtime availability of support for differentiation. AvailabilityContext getDifferentiationAvailability(); diff --git a/include/swift/Basic/LangOptions.h b/include/swift/Basic/LangOptions.h index f8d161d346e51..e4380c9a102dc 100644 --- a/include/swift/Basic/LangOptions.h +++ b/include/swift/Basic/LangOptions.h @@ -301,6 +301,9 @@ namespace swift { /// Enable experimental concurrency model. bool EnableExperimentalConcurrency = false; + /// Enable experimental back-deployment of the concurrency model. + bool EnableExperimentalBackDeployConcurrency = false; + /// Enable experimental support for named opaque result types, e.g. /// `func f() -> T`. bool EnableExperimentalNamedOpaqueTypes = false; diff --git a/include/swift/Option/FrontendOptions.td b/include/swift/Option/FrontendOptions.td index d6c99e166a04c..102d5764583dc 100644 --- a/include/swift/Option/FrontendOptions.td +++ b/include/swift/Option/FrontendOptions.td @@ -247,6 +247,10 @@ def enable_experimental_concurrency : Flag<["-"], "enable-experimental-concurrency">, HelpText<"Enable experimental concurrency model">; +def enable_experimental_back_deploy_concurrency : + Flag<["-"], "enable-experimental-back-deploy-concurrency">, + HelpText<"Enable experimental back-deployment of the concurrency model">; + def enable_experimental_distributed : Flag<["-"], "enable-experimental-distributed">, HelpText<"Enable experimental 'distributed' actors and functions">; diff --git a/lib/AST/Availability.cpp b/lib/AST/Availability.cpp index 338e89fb1192e..9bc63bff292b8 100644 --- a/lib/AST/Availability.cpp +++ b/lib/AST/Availability.cpp @@ -330,6 +330,10 @@ AvailabilityContext ASTContext::getConcurrencyAvailability() { return getSwift55Availability(); } +AvailabilityContext ASTContext::getBackDeployedConcurrencyAvailability() { + return getSwift51Availability(); +} + AvailabilityContext ASTContext::getDifferentiationAvailability() { return getSwiftFutureAvailability(); } diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index b7f0f6f2d0709..de49d10275b9c 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -422,6 +422,9 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args, Opts.EnableExperimentalConcurrency |= Args.hasArg(OPT_enable_experimental_concurrency); + Opts.EnableExperimentalBackDeployConcurrency |= + Args.hasArg(OPT_enable_experimental_back_deploy_concurrency); + Opts.EnableExperimentalNamedOpaqueTypes |= Args.hasArg(OPT_enable_experimental_named_opaque_types); diff --git a/lib/Sema/TypeCheckAvailability.cpp b/lib/Sema/TypeCheckAvailability.cpp index ddac5a038ac6b..4ce3edf933a5c 100644 --- a/lib/Sema/TypeCheckAvailability.cpp +++ b/lib/Sema/TypeCheckAvailability.cpp @@ -1694,7 +1694,9 @@ void TypeChecker::checkConcurrencyAvailability(SourceRange ReferenceRange, auto runningOS = TypeChecker::overApproximateAvailabilityAtLocation( ReferenceRange.Start, ReferenceDC); - auto availability = ctx.getConcurrencyAvailability(); + auto availability = ctx.LangOpts.EnableExperimentalBackDeployConcurrency + ? ctx.getBackDeployedConcurrencyAvailability() + : ctx.getConcurrencyAvailability(); if (!runningOS.isContainedIn(availability)) { diagnosePotentialConcurrencyUnavailability( ReferenceRange, ReferenceDC, diff --git a/test/Concurrency/concurrency_availability_back_deploy.swift b/test/Concurrency/concurrency_availability_back_deploy.swift new file mode 100644 index 0000000000000..a2a370d0fa137 --- /dev/null +++ b/test/Concurrency/concurrency_availability_back_deploy.swift @@ -0,0 +1,13 @@ +// RUN: %target-swift-frontend -parse-stdlib -target x86_64-apple-macosx10.13 -typecheck -verify -enable-experimental-back-deploy-concurrency %s +// RUN: %target-swift-frontend -parse-stdlib -target x86_64-apple-macosx10.15 -typecheck -enable-experimental-back-deploy-concurrency %s +// REQUIRES: OS=macosx + +func f() async { } // expected-error{{concurrency is only available in}} +// expected-note@-1{{add @available}} + +actor A { } // expected-error{{concurrency is only available in}} +// expected-note@-1{{add @available}} + +// Allow this without any availability for Historical Reasons. +public func swift_deletedAsyncMethodError() async { +}