Skip to content

Commit c621295

Browse files
authored
Merge pull request #85060 from tshortli/standalone-swift-runtime
AST: Rename Swift runtime availability domain to `StandaloneSwiftRuntime`
2 parents 46ce02b + 463bf91 commit c621295

20 files changed

+93
-52
lines changed

include/swift/AST/AvailabilityDomain.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,9 @@ class AvailabilityDomain final {
5151
/// Represents availability with respect to Swift language mode.
5252
SwiftLanguageMode,
5353

54-
/// Represents availability with respect to the Swift runtime.
55-
SwiftRuntime,
54+
/// Represents availability with respect to the Swift runtime when it is not
55+
/// built-in to the target platform.
56+
StandaloneSwiftRuntime,
5657

5758
/// Represents PackageDescription availability.
5859
PackageDescription,
@@ -147,8 +148,8 @@ class AvailabilityDomain final {
147148
return AvailabilityDomain(Kind::SwiftLanguageMode);
148149
}
149150

150-
static AvailabilityDomain forSwiftRuntime() {
151-
return AvailabilityDomain(Kind::SwiftRuntime);
151+
static AvailabilityDomain forStandaloneSwiftRuntime() {
152+
return AvailabilityDomain(Kind::StandaloneSwiftRuntime);
152153
}
153154

154155
static AvailabilityDomain forPackageDescription() {
@@ -192,7 +193,9 @@ class AvailabilityDomain final {
192193
return getKind() == Kind::SwiftLanguageMode;
193194
}
194195

195-
bool isSwiftRuntime() const { return getKind() == Kind::SwiftRuntime; }
196+
bool isStandaloneSwiftRuntime() const {
197+
return getKind() == Kind::StandaloneSwiftRuntime;
198+
}
196199

197200
bool isPackageDescription() const {
198201
return getKind() == Kind::PackageDescription;

include/swift/Basic/Features.def

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,10 @@ SUPPRESSIBLE_EXPERIMENTAL_FEATURE(InlineAlways, false)
555555
/// Allow use of 'Swift' (Swift runtime version) in @available attributes
556556
EXPERIMENTAL_FEATURE(SwiftRuntimeAvailability, true)
557557

558+
/// 'Swift' availability is always standalone, even when targeting platforms
559+
/// that have a built-in Swift runtime. Implies 'SwiftRuntimeAvailability'.
560+
EXPERIMENTAL_FEATURE(StandaloneSwiftAvailability, true)
561+
558562
/// Allow use of `~Sendable`.
559563
SUPPRESSIBLE_EXPERIMENTAL_FEATURE(TildeSendable, false)
560564

lib/AST/Availability.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -854,8 +854,21 @@ SemanticAvailableAttrRequest::evaluate(swift::Evaluator &evaluator,
854854
return std::nullopt;
855855
}
856856

857-
if (domain->isSwiftLanguageMode() || domain->isPackageDescription() ||
858-
domain->isSwiftRuntime()) {
857+
// Diagnose unsupported unconditional availability (deprecated, unavailable,
858+
// noasync).
859+
switch (domain->getKind()) {
860+
case AvailabilityDomain::Kind::Universal:
861+
case AvailabilityDomain::Kind::Embedded:
862+
case AvailabilityDomain::Kind::Custom:
863+
break;
864+
865+
case AvailabilityDomain::Kind::Platform:
866+
// FIXME: [runtime availability] Diagnose Swift runtime platform, too.
867+
break;
868+
869+
case AvailabilityDomain::Kind::SwiftLanguageMode:
870+
case AvailabilityDomain::Kind::StandaloneSwiftRuntime:
871+
case AvailabilityDomain::Kind::PackageDescription:
859872
switch (attr->getKind()) {
860873
case AvailableAttr::Kind::Deprecated:
861874
diags.diagnose(attrLoc,
@@ -876,6 +889,7 @@ SemanticAvailableAttrRequest::evaluate(swift::Evaluator &evaluator,
876889
case AvailableAttr::Kind::Default:
877890
break;
878891
}
892+
break;
879893
}
880894

881895
if (!hasVersionSpec && domain->isVersioned()) {

lib/AST/AvailabilityConstraint.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ domainCanBeUnconditionallyUnavailableAtRuntime(AvailabilityDomain domain,
343343
return domain.isActive(ctx);
344344

345345
case AvailabilityDomain::Kind::SwiftLanguageMode:
346-
case AvailabilityDomain::Kind::SwiftRuntime:
346+
case AvailabilityDomain::Kind::StandaloneSwiftRuntime:
347347
case AvailabilityDomain::Kind::PackageDescription:
348348
return false;
349349

@@ -371,7 +371,7 @@ domainIsUnavailableAtRuntimeIfUnintroduced(AvailabilityDomain domain,
371371
case AvailabilityDomain::Kind::Universal:
372372
case AvailabilityDomain::Kind::Platform:
373373
case AvailabilityDomain::Kind::SwiftLanguageMode:
374-
case AvailabilityDomain::Kind::SwiftRuntime:
374+
case AvailabilityDomain::Kind::StandaloneSwiftRuntime:
375375
case AvailabilityDomain::Kind::PackageDescription:
376376
return false;
377377

lib/AST/AvailabilityDomain.cpp

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -101,18 +101,27 @@ AvailabilityDomain::forCustom(ValueDecl *decl) {
101101
AvailabilityDomainForDeclRequest{decl}, {});
102102
}
103103

104+
static AvailabilityDomain getSwiftRuntimeDomain(ASTContext &ctx) {
105+
// If -enable-experimental-feature StandaloneSwiftAvailability is specified
106+
// then forcibly separate platform and Swift runtime availability.
107+
if (ctx.LangOpts.hasFeature(Feature::StandaloneSwiftAvailability))
108+
return AvailabilityDomain::forStandaloneSwiftRuntime();
109+
110+
// FIXME: [runtime availability] Return the platform Swift runtime domain.
111+
112+
return AvailabilityDomain::forStandaloneSwiftRuntime();
113+
}
114+
104115
std::optional<AvailabilityDomain>
105116
AvailabilityDomain::builtinDomainForString(StringRef string,
106117
const DeclContext *declContext) {
107-
// This parameter is used in downstream forks, do not remove.
108-
(void)declContext;
109-
118+
auto &ctx = declContext->getASTContext();
110119
auto domain =
111120
llvm::StringSwitch<std::optional<AvailabilityDomain>>(string)
112121
.Case("*", AvailabilityDomain::forUniversal())
113122
.Case("swift", AvailabilityDomain::forSwiftLanguageMode())
114123
.Case("SwiftLanguageMode", AvailabilityDomain::forSwiftLanguageMode())
115-
.Case("Swift", AvailabilityDomain::forSwiftRuntime())
124+
.Case("Swift", getSwiftRuntimeDomain(ctx))
116125
.Case("_PackageDescription",
117126
AvailabilityDomain::forPackageDescription())
118127
.Default(std::nullopt);
@@ -132,7 +141,7 @@ bool AvailabilityDomain::isVersioned() const {
132141
case Kind::Embedded:
133142
return false;
134143
case Kind::SwiftLanguageMode:
135-
case Kind::SwiftRuntime:
144+
case Kind::StandaloneSwiftRuntime:
136145
case Kind::PackageDescription:
137146
case Kind::Platform:
138147
return true;
@@ -153,7 +162,7 @@ bool AvailabilityDomain::isVersionValid(
153162
case Kind::SwiftLanguageMode:
154163
case Kind::PackageDescription:
155164
return true;
156-
case Kind::SwiftRuntime:
165+
case Kind::StandaloneSwiftRuntime:
157166
// Swift 5.0 is the first ABI stable Swift runtime version.
158167
if (version.getMajor() < 5)
159168
return false;
@@ -175,7 +184,7 @@ bool AvailabilityDomain::supportsContextRefinement() const {
175184
case Kind::SwiftLanguageMode:
176185
case Kind::PackageDescription:
177186
return false;
178-
case Kind::SwiftRuntime:
187+
case Kind::StandaloneSwiftRuntime:
179188
case Kind::Platform:
180189
case Kind::Custom:
181190
return true;
@@ -189,7 +198,7 @@ bool AvailabilityDomain::supportsQueries() const {
189198
case Kind::SwiftLanguageMode:
190199
case Kind::PackageDescription:
191200
return false;
192-
case Kind::SwiftRuntime:
201+
case Kind::StandaloneSwiftRuntime:
193202
case Kind::Platform:
194203
case Kind::Custom:
195204
return true;
@@ -204,7 +213,10 @@ bool AvailabilityDomain::isActive(const ASTContext &ctx,
204213
case Kind::PackageDescription:
205214
case Kind::Embedded:
206215
return true;
207-
case Kind::SwiftRuntime:
216+
case Kind::StandaloneSwiftRuntime:
217+
// FIXME: [runtime availability] Active either when
218+
// StandaloneSwiftAvailability is enabled or the target supports a
219+
// standalone Swift runtime.
208220
return ctx.LangOpts.hasFeature(Feature::SwiftRuntimeAvailability);
209221
case Kind::Platform:
210222
return isPlatformActive(getPlatformKind(), ctx.LangOpts, forTargetVariant);
@@ -231,7 +243,7 @@ bool AvailabilityDomain::mustBeSpecifiedAlone() const {
231243
case Kind::Embedded:
232244
case Kind::Custom:
233245
return true;
234-
case Kind::SwiftRuntime:
246+
case Kind::StandaloneSwiftRuntime:
235247
case Kind::Platform:
236248
// Platform and Swift runtime availability specifications can appear
237249
// together, e.g. `@available(Swift 6, macOS 15, iOS 18, *)`.
@@ -252,7 +264,7 @@ getDeploymentVersion(const AvailabilityDomain &domain, const ASTContext &ctx) {
252264
return ctx.LangOpts.EffectiveLanguageVersion;
253265
case AvailabilityDomain::Kind::PackageDescription:
254266
return ctx.LangOpts.PackageDescriptionVersion;
255-
case AvailabilityDomain::Kind::SwiftRuntime:
267+
case AvailabilityDomain::Kind::StandaloneSwiftRuntime:
256268
if (!ctx.LangOpts.hasFeature(Feature::SwiftRuntimeAvailability))
257269
return std::nullopt;
258270
return ctx.LangOpts.MinSwiftRuntimeVersion;
@@ -292,7 +304,7 @@ llvm::StringRef AvailabilityDomain::getNameForDiagnostics() const {
292304
case Kind::SwiftLanguageMode:
293305
// FIXME: [runtime availability] Render language mode diags differently.
294306
return "Swift";
295-
case Kind::SwiftRuntime:
307+
case Kind::StandaloneSwiftRuntime:
296308
return "Swift";
297309
case Kind::PackageDescription:
298310
return "PackageDescription";
@@ -311,7 +323,7 @@ llvm::StringRef AvailabilityDomain::getNameForAttributePrinting() const {
311323
return "*";
312324
case Kind::SwiftLanguageMode:
313325
return "swift";
314-
case Kind::SwiftRuntime:
326+
case Kind::StandaloneSwiftRuntime:
315327
return "Swift";
316328
case Kind::PackageDescription:
317329
return "_PackageDescription";
@@ -343,12 +355,11 @@ bool AvailabilityDomain::contains(const AvailabilityDomain &other) const {
343355
case Kind::Universal:
344356
return true;
345357
case Kind::SwiftLanguageMode:
358+
case Kind::StandaloneSwiftRuntime:
346359
case Kind::PackageDescription:
347360
case Kind::Embedded:
348361
case Kind::Custom:
349362
return other == *this;
350-
case Kind::SwiftRuntime:
351-
return other.isPlatform() || other == *this;
352363
case Kind::Platform:
353364
if (getPlatformKind() == other.getPlatformKind())
354365
return true;
@@ -362,7 +373,7 @@ bool AvailabilityDomain::isRoot() const {
362373
case AvailabilityDomain::Kind::Universal:
363374
case AvailabilityDomain::Kind::Embedded:
364375
case AvailabilityDomain::Kind::SwiftLanguageMode:
365-
case AvailabilityDomain::Kind::SwiftRuntime:
376+
case AvailabilityDomain::Kind::StandaloneSwiftRuntime:
366377
case AvailabilityDomain::Kind::PackageDescription:
367378
return true;
368379
case AvailabilityDomain::Kind::Platform:
@@ -448,7 +459,7 @@ AvailabilityDomain AvailabilityDomain::copy(ASTContext &ctx) const {
448459
switch (getKind()) {
449460
case Kind::Universal:
450461
case Kind::SwiftLanguageMode:
451-
case Kind::SwiftRuntime:
462+
case Kind::StandaloneSwiftRuntime:
452463
case Kind::PackageDescription:
453464
case Kind::Embedded:
454465
case Kind::Platform:
@@ -471,7 +482,7 @@ bool StableAvailabilityDomainComparator::operator()(
471482
switch (lhsKind) {
472483
case AvailabilityDomain::Kind::Universal:
473484
case AvailabilityDomain::Kind::SwiftLanguageMode:
474-
case AvailabilityDomain::Kind::SwiftRuntime:
485+
case AvailabilityDomain::Kind::StandaloneSwiftRuntime:
475486
case AvailabilityDomain::Kind::PackageDescription:
476487
case AvailabilityDomain::Kind::Embedded:
477488
return false;
@@ -560,7 +571,7 @@ AvailabilityDomainOrIdentifier::lookUpInDeclContext(
560571
}
561572

562573
// Use of the 'Swift' domain requires the 'SwiftRuntimeAvailability' feature.
563-
if (!hasSwiftRuntimeAvailability && domain->isSwiftRuntime()) {
574+
if (!hasSwiftRuntimeAvailability && domain->isStandaloneSwiftRuntime()) {
564575
diags.diagnose(loc, diag::availability_domain_requires_feature, *domain,
565576
"SwiftRuntimeAvailability");
566577
return std::nullopt;

lib/AST/AvailabilityQuery.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ AvailabilityQuery::AvailabilityQuery(
3737
DEBUG_ASSERT(kind != ResultKind::Dynamic);
3838
break;
3939

40-
case AvailabilityDomain::Kind::SwiftRuntime:
40+
case AvailabilityDomain::Kind::StandaloneSwiftRuntime:
4141
// Dynamic Swift runtime queries take just a primary version argument.
4242
if (kind == ResultKind::Dynamic) {
4343
DEBUG_ASSERT(primaryRange);
@@ -186,7 +186,7 @@ FuncDecl *AvailabilityQuery::getDynamicQueryDeclAndArguments(
186186
// These domains don't support dynamic queries.
187187
return nullptr;
188188

189-
case AvailabilityDomain::Kind::SwiftRuntime:
189+
case AvailabilityDomain::Kind::StandaloneSwiftRuntime:
190190
unpackVersion(getPrimaryArgument().value(), arguments);
191191
return ctx.getIsSwiftRuntimeVersionAtLeast();
192192
case AvailabilityDomain::Kind::Platform:

lib/AST/AvailabilityScopeBuilder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -869,7 +869,7 @@ class AvailabilityScopeBuilder : private ASTWalker {
869869
return AvailabilityQuery::dynamic(variantSpec->getDomain(), primaryRange,
870870
variantRange);
871871

872-
case AvailabilityDomain::Kind::SwiftRuntime:
872+
case AvailabilityDomain::Kind::StandaloneSwiftRuntime:
873873
return AvailabilityQuery::dynamic(domain, primaryRange, std::nullopt);
874874

875875
case AvailabilityDomain::Kind::Platform:

lib/AST/FeatureSet.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,7 @@ static bool usesFeatureInlineAlways(Decl *decl) {
448448
}
449449

450450
UNINTERESTING_FEATURE(SwiftRuntimeAvailability)
451+
UNINTERESTING_FEATURE(StandaloneSwiftAvailability)
451452

452453
static bool usesFeatureTildeSendable(Decl *decl) {
453454
auto *TD = dyn_cast<TypeDecl>(decl);

lib/Frontend/CompilerInvocation.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -939,9 +939,15 @@ static bool ParseEnabledFeatureArgs(LangOptions &Opts, ArgList &Args,
939939
if (!seenFeatures.insert(*feature).second)
940940
continue;
941941

942+
bool forMigration = featureMode.has_value();
943+
942944
// Enable the feature if requested.
943945
if (isEnableFeatureFlag)
944-
Opts.enableFeature(*feature, /*forMigration=*/featureMode.has_value());
946+
Opts.enableFeature(*feature, forMigration);
947+
948+
// 'StandaloneSwiftAvailability' implies 'SwiftRuntimeAvailability'
949+
if (*feature == Feature::StandaloneSwiftAvailability)
950+
Opts.enableFeature(Feature::SwiftRuntimeAvailability, forMigration);
945951
}
946952

947953
// Since pseudo-features don't have a boolean on/off state, process them in

lib/Sema/TypeCheckAvailability.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1699,7 +1699,7 @@ bool shouldHideDomainNameForConstraintDiagnostic(
16991699
case AvailabilityDomain::Kind::Custom:
17001700
case AvailabilityDomain::Kind::PackageDescription:
17011701
return true;
1702-
case AvailabilityDomain::Kind::SwiftRuntime:
1702+
case AvailabilityDomain::Kind::StandaloneSwiftRuntime:
17031703
case AvailabilityDomain::Kind::Platform:
17041704
return false;
17051705
case AvailabilityDomain::Kind::SwiftLanguageMode:

0 commit comments

Comments
 (0)