Files
swift-mirror/test/SILGen/availability_query_custom_domains.swift
Allan Shortlidge 0647da5416 AST: Introduce an "always enabled" custom availability domain kind.
An always enabled availability domain is implicitly available in all contexts,
so uses of declarations that are marked as `@available` in the domain are never
rejected. This is useful for an availability domain representing a feature flag
that has become permanently enabled.

Partially resolves rdar://157593409.
2025-09-11 14:39:05 -07:00

188 lines
6.6 KiB
Swift

// RUN: %target-swift-emit-silgen -module-name Test %s -verify \
// RUN: -enable-experimental-feature CustomAvailability \
// RUN: -define-enabled-availability-domain EnabledDomain \
// RUN: -define-always-enabled-availability-domain AlwaysEnabledDomain \
// RUN: -define-disabled-availability-domain DisabledDomain \
// RUN: -define-dynamic-availability-domain DynamicDomain \
// RUN: | %FileCheck %s
// REQUIRES: swift_feature_CustomAvailability
@available(EnabledDomain)
public func availableInEnabledDomain() { }
@available(EnabledDomain, unavailable)
public func unavailableInEnabledDomain() { }
@available(AlwaysEnabledDomain)
public func availableInAlwaysEnabledDomain() { }
@available(AlwaysEnabledDomain, unavailable)
public func unavailableInAlwaysEnabledDomain() { }
@available(DisabledDomain)
public func availableInDisabledDomain() { }
@available(DisabledDomain, unavailable)
public func unavailableInDisabledDomain() { }
@available(DynamicDomain)
public func availableInDynamicDomain() { }
@available(DynamicDomain, unavailable)
public func unavailableInDynamicDomain() { }
// CHECK-LABEL: sil{{.*}}$s4Test28testIfAvailableEnabledDomainyyF : $@convention(thin) () -> ()
public func testIfAvailableEnabledDomain() {
// CHECK: bb0:
// CHECK: [[PRED:%.*]] = integer_literal $Builtin.Int1, -1
// CHECK: cond_br [[PRED]], [[TRUE_BB:bb[0-9]+]], [[FALSE_BB:bb[0-9]+]]
// CHECK: [[TRUE_BB]]:
// CHECK: function_ref @$s4Test24availableInEnabledDomainyyF
// CHECK: [[FALSE_BB]]:
// CHECK: function_ref @$s4Test26unavailableInEnabledDomainyyF
if #available(EnabledDomain) {
availableInEnabledDomain()
} else {
unavailableInEnabledDomain()
}
}
// CHECK: end sil function '$s4Test28testIfAvailableEnabledDomainyyF'
// CHECK-LABEL: sil{{.*}}$s4Test30testIfUnavailableEnabledDomainyyF : $@convention(thin) () -> ()
public func testIfUnavailableEnabledDomain() {
// CHECK: bb0:
// CHECK: [[PRED:%.*]] = integer_literal $Builtin.Int1, 0
// CHECK: cond_br [[PRED]], [[TRUE_BB:bb[0-9]+]], [[FALSE_BB:bb[0-9]+]]
// CHECK: [[TRUE_BB]]:
// CHECK: function_ref @$s4Test26unavailableInEnabledDomainyyF
// CHECK: [[FALSE_BB]]:
// CHECK: function_ref @$s4Test24availableInEnabledDomainyyF
if #unavailable(EnabledDomain) {
unavailableInEnabledDomain()
} else {
availableInEnabledDomain()
}
}
// CHECK: end sil function '$s4Test30testIfUnavailableEnabledDomainyyF'
// CHECK-LABEL: sil{{.*}}$s4Test34testIfAvailableAlwaysEnabledDomainyyF : $@convention(thin) () -> ()
public func testIfAvailableAlwaysEnabledDomain() {
// CHECK: bb0:
// CHECK: [[PRED:%.*]] = integer_literal $Builtin.Int1, -1
// CHECK: cond_br [[PRED]], [[TRUE_BB:bb[0-9]+]], [[FALSE_BB:bb[0-9]+]]
// CHECK: [[TRUE_BB]]:
// CHECK: function_ref @$s4Test30availableInAlwaysEnabledDomainyyF
// CHECK: [[FALSE_BB]]:
// CHECK: function_ref @$s4Test32unavailableInAlwaysEnabledDomainyyF
if #available(AlwaysEnabledDomain) {
availableInAlwaysEnabledDomain()
} else {
unavailableInAlwaysEnabledDomain()
}
}
// CHECK: end sil function '$s4Test34testIfAvailableAlwaysEnabledDomainyyF'
// CHECK-LABEL: sil{{.*}}$s4Test36testIfUnavailableAlwaysEnabledDomainyyF : $@convention(thin) () -> ()
public func testIfUnavailableAlwaysEnabledDomain() {
// CHECK: bb0:
// CHECK: [[PRED:%.*]] = integer_literal $Builtin.Int1, 0
// CHECK: cond_br [[PRED]], [[TRUE_BB:bb[0-9]+]], [[FALSE_BB:bb[0-9]+]]
// CHECK: [[TRUE_BB]]:
// CHECK: function_ref @$s4Test32unavailableInAlwaysEnabledDomainyyF
// CHECK: [[FALSE_BB]]:
// CHECK: function_ref @$s4Test30availableInAlwaysEnabledDomainyyF
if #unavailable(AlwaysEnabledDomain) {
unavailableInAlwaysEnabledDomain()
} else {
availableInAlwaysEnabledDomain()
}
}
// CHECK: end sil function '$s4Test36testIfUnavailableAlwaysEnabledDomainyyF'
// CHECK-LABEL: sil{{.*}}$s4Test29testIfAvailableDisabledDomainyyF : $@convention(thin) () -> ()
public func testIfAvailableDisabledDomain() {
// CHECK: bb0:
// CHECK: [[PRED:%.*]] = integer_literal $Builtin.Int1, 0
// CHECK: cond_br [[PRED]], [[TRUE_BB:bb[0-9]+]], [[FALSE_BB:bb[0-9]+]]
// CHECK: [[TRUE_BB]]:
// CHECK: function_ref @$s4Test25availableInDisabledDomainyyF
// CHECK: [[FALSE_BB]]:
// CHECK: function_ref @$s4Test27unavailableInDisabledDomainyyF
if #available(DisabledDomain) {
availableInDisabledDomain()
} else {
unavailableInDisabledDomain()
}
}
// CHECK: end sil function '$s4Test29testIfAvailableDisabledDomainyyF'
// CHECK-LABEL: sil{{.*}}$s4Test31testIfUnavailableDisabledDomainyyF : $@convention(thin) () -> ()
public func testIfUnavailableDisabledDomain() {
// CHECK: bb0:
// CHECK: [[PRED:%.*]] = integer_literal $Builtin.Int1, -1
// CHECK: cond_br [[PRED]], [[TRUE_BB:bb[0-9]+]], [[FALSE_BB:bb[0-9]+]]
// CHECK: [[TRUE_BB]]:
// CHECK: function_ref @$s4Test27unavailableInDisabledDomainyyF
// CHECK: [[FALSE_BB]]:
// CHECK: function_ref @$s4Test25availableInDisabledDomainyyF
if #unavailable(DisabledDomain) {
unavailableInDisabledDomain()
} else {
availableInDisabledDomain()
}
}
// CHECK: end sil function '$s4Test31testIfUnavailableDisabledDomainyyF'
// CHECK-LABEL: sil{{.*}}$s4Test28testIfAvailableDynamicDomainyyF : $@convention(thin) () -> ()
public func testIfAvailableDynamicDomain() {
// FIXME: [availability] Call dynamic domain predicate function
// CHECK: bb0:
// CHECK: [[PRED:%.*]] = integer_literal $Builtin.Int1, -1
// CHECK: cond_br [[PRED]], [[TRUE_BB:bb[0-9]+]], [[FALSE_BB:bb[0-9]+]]
// CHECK: [[TRUE_BB]]:
// CHECK: function_ref @$s4Test24availableInDynamicDomainyyF
// CHECK: [[FALSE_BB]]:
// CHECK: function_ref @$s4Test26unavailableInDynamicDomainyyF
if #available(DynamicDomain) {
availableInDynamicDomain()
} else {
unavailableInDynamicDomain()
}
}
// CHECK: end sil function '$s4Test28testIfAvailableDynamicDomainyyF'
// CHECK-LABEL: sil{{.*}}$s4Test30testIfUnavailableDynamicDomainyyF : $@convention(thin) () -> ()
public func testIfUnavailableDynamicDomain() {
// FIXME: [availability] Call dynamic domain predicate function
// CHECK: bb0:
// CHECK: [[PRED:%.*]] = integer_literal $Builtin.Int1, 0
// CHECK: cond_br [[PRED]], [[TRUE_BB:bb[0-9]+]], [[FALSE_BB:bb[0-9]+]]
// CHECK: [[TRUE_BB]]:
// CHECK: function_ref @$s4Test26unavailableInDynamicDomainyyF
// CHECK: [[FALSE_BB]]:
// CHECK: function_ref @$s4Test24availableInDynamicDomainyyF
if #unavailable(DynamicDomain) {
unavailableInDynamicDomain()
} else {
availableInDynamicDomain()
}
}
// CHECK: end sil function '$s4Test30testIfUnavailableDynamicDomainyyF'