mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
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.
188 lines
6.6 KiB
Swift
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'
|