AST/Basic: Introduce the StandaloneSwiftAvailability experimental feature.

This experimental feature will be used to force the compiler to treat `Swift`
runtime availability as separate from platform availability when compiling for
targets that have the Swift runtime built-in.
This commit is contained in:
Allan Shortlidge
2025-10-20 15:30:14 -07:00
parent 46ce02bb5b
commit 16dee385bf
8 changed files with 24 additions and 13 deletions

View File

@@ -555,6 +555,10 @@ SUPPRESSIBLE_EXPERIMENTAL_FEATURE(InlineAlways, false)
/// Allow use of 'Swift' (Swift runtime version) in @available attributes
EXPERIMENTAL_FEATURE(SwiftRuntimeAvailability, true)
/// 'Swift' availability is always standalone, even when targeting platforms
/// that have a built-in Swift runtime. Implies 'SwiftRuntimeAvailability'.
EXPERIMENTAL_FEATURE(StandaloneSwiftAvailability, true)
/// Allow use of `~Sendable`.
SUPPRESSIBLE_EXPERIMENTAL_FEATURE(TildeSendable, false)

View File

@@ -448,6 +448,7 @@ static bool usesFeatureInlineAlways(Decl *decl) {
}
UNINTERESTING_FEATURE(SwiftRuntimeAvailability)
UNINTERESTING_FEATURE(StandaloneSwiftAvailability)
static bool usesFeatureTildeSendable(Decl *decl) {
auto *TD = dyn_cast<TypeDecl>(decl);

View File

@@ -939,9 +939,15 @@ static bool ParseEnabledFeatureArgs(LangOptions &Opts, ArgList &Args,
if (!seenFeatures.insert(*feature).second)
continue;
bool forMigration = featureMode.has_value();
// Enable the feature if requested.
if (isEnableFeatureFlag)
Opts.enableFeature(*feature, /*forMigration=*/featureMode.has_value());
Opts.enableFeature(*feature, forMigration);
// 'StandaloneSwiftAvailability' implies 'SwiftRuntimeAvailability'
if (*feature == Feature::StandaloneSwiftAvailability)
Opts.enableFeature(Feature::SwiftRuntimeAvailability, forMigration);
}
// Since pseudo-features don't have a boolean on/off state, process them in

View File

@@ -1,6 +1,6 @@
// RUN: %target-typecheck-verify-swift -parse-as-library -enable-experimental-feature SwiftRuntimeAvailability -min-swift-runtime-version 5.5
// RUN: %target-typecheck-verify-swift -parse-as-library -enable-experimental-feature StandaloneSwiftAvailability -min-swift-runtime-version 5.5
// REQUIRES: swift_feature_SwiftRuntimeAvailability
// REQUIRES: swift_feature_StandaloneSwiftAvailability
@available(Swift 5.0, *)
func availableInSwift5_0Runtime() { }

View File

@@ -1,6 +1,6 @@
// RUN: %target-swift-emit-ir %s -min-swift-runtime-version 5.0 -O -enable-experimental-feature SwiftRuntimeAvailability | %FileCheck %s
// RUN: %target-swift-emit-ir %s -min-swift-runtime-version 5.0 -O -enable-experimental-feature StandaloneSwiftAvailability | %FileCheck %s
// REQUIRES: swift_feature_SwiftRuntimeAvailability
// REQUIRES: swift_feature_StandaloneSwiftAvailability
@_silgen_name("callMeMaybe")
public func callMeMaybe()

View File

@@ -1,7 +1,7 @@
// RUN: %target-swift-emit-sil %s -min-swift-runtime-version 5.0 -verify -enable-experimental-feature SwiftRuntimeAvailability
// RUN: %target-swift-emit-silgen %s -min-swift-runtime-version 5.0 -enable-experimental-feature SwiftRuntimeAvailability | %FileCheck %s
// RUN: %target-swift-emit-sil %s -min-swift-runtime-version 5.0 -verify -enable-experimental-feature StandaloneSwiftAvailability
// RUN: %target-swift-emit-silgen %s -min-swift-runtime-version 5.0 -enable-experimental-feature StandaloneSwiftAvailability | %FileCheck %s
// REQUIRES: swift_feature_SwiftRuntimeAvailability
// REQUIRES: swift_feature_StandaloneSwiftAvailability
// CHECK-LABEL: sil [ossa] @$s32availability_query_swift_runtime15testIfAvailableyyF : $@convention(thin) () -> () {
// CHECK: [[MAJOR:%.*]] = integer_literal $Builtin.Word, 6

View File

@@ -1,8 +1,8 @@
// RUN: %target-swift-emit-sil %s -target %target-cpu-apple-macosx11 -target-variant %target-cpu-apple-ios14-macabi -min-swift-runtime-version 5.0 -verify -enable-experimental-feature SwiftRuntimeAvailability
// RUN: %target-swift-emit-silgen %s -target %target-cpu-apple-macosx11 -target-variant %target-cpu-apple-ios14-macabi -min-swift-runtime-version 5.0 -enable-experimental-feature SwiftRuntimeAvailability | %FileCheck %s
// RUN: %target-swift-emit-sil %s -target %target-cpu-apple-macosx11 -target-variant %target-cpu-apple-ios14-macabi -min-swift-runtime-version 5.0 -verify -enable-experimental-feature StandaloneSwiftAvailability
// RUN: %target-swift-emit-silgen %s -target %target-cpu-apple-macosx11 -target-variant %target-cpu-apple-ios14-macabi -min-swift-runtime-version 5.0 -enable-experimental-feature StandaloneSwiftAvailability | %FileCheck %s
// REQUIRES: OS=macosx || OS=maccatalyst
// REQUIRES: swift_feature_SwiftRuntimeAvailability
// REQUIRES: swift_feature_StandaloneSwiftAvailability
// CHECK-LABEL: sil [ossa] @$s53availability_query_swift_runtime_maccatalyst_zippered15testIfAvailableyyF : $@convention(thin) () -> () {
// CHECK: [[MAJOR:%.*]] = integer_literal $Builtin.Word, 6

View File

@@ -1,6 +1,6 @@
// RUN: %target-typecheck-verify-swift -swift-version 5 -parse-as-library -enable-experimental-feature SwiftRuntimeAvailability
// RUN: %target-typecheck-verify-swift -swift-version 5 -parse-as-library -enable-experimental-feature StandaloneSwiftAvailability
// REQUIRES: swift_feature_SwiftRuntimeAvailability
// REQUIRES: swift_feature_StandaloneSwiftAvailability
@available(Swift 6, *)
func availableInSwiftRuntime6Short() { }