Skip to content

Commit b9fd3e4

Browse files
authored
Merge pull request #84778 from tshortli/swift-runtime-availability-domain
AST: Introduce a Swift runtime availability domain
2 parents 8b58d83 + 1a86cd9 commit b9fd3e4

29 files changed

+293
-73
lines changed

include/swift/AST/Attr.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3972,7 +3972,7 @@ class SemanticAvailableAttr final {
39723972

39733973
/// Whether this is a language mode specific attribute.
39743974
bool isSwiftLanguageModeSpecific() const {
3975-
return getDomain().isSwiftLanguage() && isVersionSpecific();
3975+
return getDomain().isSwiftLanguageMode() && isVersionSpecific();
39763976
}
39773977

39783978
/// Whether this is a PackageDescription version specific attribute.

include/swift/AST/AvailabilityDomain.h

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,10 @@ class AvailabilityDomain final {
4949
Universal,
5050

5151
/// Represents availability with respect to Swift language mode.
52-
SwiftLanguage,
52+
SwiftLanguageMode,
53+
54+
/// Represents availability with respect to the Swift runtime.
55+
SwiftRuntime,
5356

5457
/// Represents PackageDescription availability.
5558
PackageDescription,
@@ -140,8 +143,12 @@ class AvailabilityDomain final {
140143
return AvailabilityDomain(platformKind);
141144
}
142145

143-
static AvailabilityDomain forSwiftLanguage() {
144-
return AvailabilityDomain(Kind::SwiftLanguage);
146+
static AvailabilityDomain forSwiftLanguageMode() {
147+
return AvailabilityDomain(Kind::SwiftLanguageMode);
148+
}
149+
150+
static AvailabilityDomain forSwiftRuntime() {
151+
return AvailabilityDomain(Kind::SwiftRuntime);
145152
}
146153

147154
static AvailabilityDomain forPackageDescription() {
@@ -181,7 +188,11 @@ class AvailabilityDomain final {
181188

182189
bool isPlatform() const { return getKind() == Kind::Platform; }
183190

184-
bool isSwiftLanguage() const { return getKind() == Kind::SwiftLanguage; }
191+
bool isSwiftLanguageMode() const {
192+
return getKind() == Kind::SwiftLanguageMode;
193+
}
194+
195+
bool isSwiftRuntime() const { return getKind() == Kind::SwiftRuntime; }
185196

186197
bool isPackageDescription() const {
187198
return getKind() == Kind::PackageDescription;
@@ -234,6 +245,10 @@ class AvailabilityDomain final {
234245
bool isActivePlatform(const ASTContext &ctx,
235246
bool forTargetVariant = false) const;
236247

248+
/// Returns true if availability in this domain must be specified alone in
249+
/// `@available` attributes and `if #available` queries.
250+
bool mustBeSpecifiedAlone() const;
251+
237252
/// Returns the domain's minimum available range for type checking. For
238253
/// example, for the domain of the platform that compilation is targeting,
239254
/// this version is specified with the `-target` option. For the Swift

include/swift/AST/DiagnosticsSema.def

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6986,6 +6986,12 @@ WARNING(availability_unsupported_version_number, none,
69866986
WARNING(availability_invalid_version_number_for_domain, none,
69876987
"'%0' is not a valid version number for %1",
69886988
(llvm::VersionTuple, AvailabilityDomain))
6989+
WARNING(availability_domain_renamed, none,
6990+
"%0 has been renamed to '%1'",
6991+
(Identifier, StringRef))
6992+
ERROR(availability_domain_requires_feature, none,
6993+
"%0 requires '-enable-experimental-feature %1'",
6994+
(AvailabilityDomain, StringRef))
69896995

69906996
WARNING(attr_availability_expected_deprecated_version, none,
69916997
"expected version number with 'deprecated' in '%0' attribute for %1",
@@ -6996,9 +7002,6 @@ WARNING(attr_availability_cannot_be_used_for_domain, none,
69967002
WARNING(attr_availability_expected_version_spec, none,
69977003
"expected 'introduced', 'deprecated', or 'obsoleted' in '%0' attribute "
69987004
"for %1", (const DeclAttribute, AvailabilityDomain))
6999-
ERROR(attr_availability_requires_custom_availability, none,
7000-
"%0 requires '-enable-experimental-feature CustomAvailability'",
7001-
(AvailabilityDomain))
70027005
ERROR(attr_availability_domain_access, none,
70037006
"availability domain '%0' is "
70047007
"%select{private|fileprivate|internal|package|%error|%error}1 "

include/swift/Basic/Features.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,9 @@ EXPERIMENTAL_FEATURE(BorrowAndMutateAccessors, false)
556556
/// Allow use of @inline(always) attribute
557557
SUPPRESSIBLE_EXPERIMENTAL_FEATURE(InlineAlways, false)
558558

559+
/// Allow use of 'Swift' (Swift runtime version) in @available attributes
560+
EXPERIMENTAL_FEATURE(SwiftRuntimeAvailability, true)
561+
559562
#undef EXPERIMENTAL_FEATURE_EXCLUDED_FROM_MODULE_INTERFACE
560563
#undef EXPERIMENTAL_FEATURE
561564
#undef UPCOMING_FEATURE

include/swift/Basic/LangOptions.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,9 @@ namespace swift {
188188
/// Swift runtime version to compile for.
189189
version::Version RuntimeVersion = version::Version::getCurrentLanguageVersion();
190190

191+
/// The minimum Swift runtime version that the progam can be deployed to.
192+
version::Version MinSwiftRuntimeVersion;
193+
191194
/// PackageDescription version to compile for.
192195
version::Version PackageDescriptionVersion;
193196

include/swift/Option/Options.td

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,13 @@ def language_mode : Separate<["-"], "language-mode">,
298298
MetaVarName<"<mode>">,
299299
Alias<swift_version>;
300300

301+
def min_swift_runtime_version
302+
: Separate<["-"], "min-swift-runtime-version">,
303+
Flags<[FrontendOption, ModuleInterfaceOptionIgnorable]>,
304+
HelpText<"The minimum Swift runtime version "
305+
"that will be available at runtime">,
306+
MetaVarName<"<vers>">;
307+
301308
def package_description_version: Separate<["-"], "package-description-version">,
302309
Flags<[FrontendOption, HelpHidden, ModuleInterfaceOption]>,
303310
HelpText<"The version number to be applied on the input for the PackageDescription availability kind">,

lib/APIDigester/ModuleAnalyzerNodes.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1380,7 +1380,7 @@ StringRef SDKContext::getLanguageIntroVersion(Decl *D) {
13801380
for (auto attr : D->getSemanticAvailableAttrs()) {
13811381
auto domain = attr.getDomain();
13821382

1383-
if (domain.isSwiftLanguage() && attr.getIntroduced()) {
1383+
if (domain.isSwiftLanguageMode() && attr.getIntroduced()) {
13841384
return buffer(attr.getIntroduced()->getAsString());
13851385
}
13861386
}

lib/AST/Attr.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -978,7 +978,7 @@ static void printAvailableAttr(const Decl *D, const SemanticAvailableAttr &Attr,
978978
// attributes that are universally unavailable in Swift, we must print them
979979
// as universally unavailable instead.
980980
// FIXME: Reconsider this, it's a weird special case.
981-
if (Domain.isSwiftLanguage() && Attr.isUnconditionallyUnavailable())
981+
if (Domain.isSwiftLanguageMode() && Attr.isUnconditionallyUnavailable())
982982
Printer << "*";
983983
else
984984
Printer << Domain.getNameForAttributePrinting();
@@ -1020,7 +1020,8 @@ static void printAvailableAttr(const Decl *D, const SemanticAvailableAttr &Attr,
10201020
if (!Attr.getMessage().empty()) {
10211021
Printer << ", message: ";
10221022
Printer.printEscapedStringLiteral(Attr.getMessage());
1023-
} else if (Domain.isSwiftLanguage() && Attr.isUnconditionallyUnavailable())
1023+
} else if (Domain.isSwiftLanguageMode() &&
1024+
Attr.isUnconditionallyUnavailable())
10241025
Printer << ", message: \"Not available in Swift\"";
10251026
}
10261027

@@ -2329,7 +2330,7 @@ AvailableAttr *AvailableAttr::createUnavailableInSwift(ASTContext &C,
23292330
StringRef Message,
23302331
StringRef Rename) {
23312332
return new (C) AvailableAttr(
2332-
SourceLoc(), SourceRange(), AvailabilityDomain::forSwiftLanguage(),
2333+
SourceLoc(), SourceRange(), AvailabilityDomain::forSwiftLanguageMode(),
23332334
SourceLoc(), Kind::Unavailable, Message, Rename,
23342335
/*Introduced=*/{}, SourceRange(), /*Deprecated=*/{}, SourceRange(),
23352336
/*Obsoleted=*/{}, SourceRange(),
@@ -2341,7 +2342,7 @@ AvailableAttr *AvailableAttr::createSwiftLanguageModeVersioned(
23412342
ASTContext &C, StringRef Message, StringRef Rename,
23422343
llvm::VersionTuple Introduced, llvm::VersionTuple Obsoleted) {
23432344
return new (C) AvailableAttr(
2344-
SourceLoc(), SourceRange(), AvailabilityDomain::forSwiftLanguage(),
2345+
SourceLoc(), SourceRange(), AvailabilityDomain::forSwiftLanguageMode(),
23452346
SourceLoc(), Kind::Default, Message, Rename, Introduced, SourceRange(),
23462347
/*Deprecated=*/{}, SourceRange(), Obsoleted, SourceRange(),
23472348
/*Implicit=*/false,

lib/AST/Availability.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,7 @@ computeDeclRuntimeAvailability(const Decl *decl) {
640640
if (!domain.isActive(ctx) && !isTargetDomain)
641641
continue;
642642

643+
// FIXME: [runtime availability] Update this?
643644
if (!domain.isRoot())
644645
continue;
645646

@@ -855,7 +856,8 @@ SemanticAvailableAttrRequest::evaluate(swift::Evaluator &evaluator,
855856
return std::nullopt;
856857
}
857858

858-
if (domain->isSwiftLanguage() || domain->isPackageDescription()) {
859+
if (domain->isSwiftLanguageMode() || domain->isPackageDescription() ||
860+
domain->isSwiftRuntime()) {
859861
switch (attr->getKind()) {
860862
case AvailableAttr::Kind::Deprecated:
861863
diags.diagnose(attrLoc,

lib/AST/AvailabilityConstraint.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ static bool canIgnoreConstraintInUnavailableContexts(
162162
if (!flags.contains(AvailabilityConstraintFlag::
163163
AllowUniversallyUnavailableInCompatibleContexts)) {
164164
if (!isa<TypeDecl>(decl) && !isa<ExtensionDecl>(decl)) {
165-
if (domain.isUniversal() || domain.isSwiftLanguage())
165+
if (domain.isUniversal() || domain.isSwiftLanguageMode())
166166
return false;
167167
}
168168
}
@@ -342,7 +342,8 @@ domainCanBeUnconditionallyUnavailableAtRuntime(AvailabilityDomain domain,
342342
return true;
343343
return domain.isActive(ctx);
344344

345-
case AvailabilityDomain::Kind::SwiftLanguage:
345+
case AvailabilityDomain::Kind::SwiftLanguageMode:
346+
case AvailabilityDomain::Kind::SwiftRuntime:
346347
case AvailabilityDomain::Kind::PackageDescription:
347348
return false;
348349

@@ -369,7 +370,8 @@ domainIsUnavailableAtRuntimeIfUnintroduced(AvailabilityDomain domain,
369370
switch (domain.getKind()) {
370371
case AvailabilityDomain::Kind::Universal:
371372
case AvailabilityDomain::Kind::Platform:
372-
case AvailabilityDomain::Kind::SwiftLanguage:
373+
case AvailabilityDomain::Kind::SwiftLanguageMode:
374+
case AvailabilityDomain::Kind::SwiftRuntime:
373375
case AvailabilityDomain::Kind::PackageDescription:
374376
return false;
375377

0 commit comments

Comments
 (0)