mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
For dynamic features defined from a header, we synthesize a pure Clang function to check whether the feature should be enabled at runtime. Swift modules don't have capability to deserialize this clang predicate function, leading to crasher as a result. This change fixes the crasher by hiding the synthesized function to be a module internal one. rdar://164410957
133 lines
5.3 KiB
Swift
133 lines
5.3 KiB
Swift
// RUN: %target-swift-emit-silgen -module-name Test %s -verify \
|
|
// RUN: -enable-experimental-feature CustomAvailability \
|
|
// RUN: -import-bridging-header %S/Inputs/AvailabilityDomains.h \
|
|
// RUN: | %FileCheck %s
|
|
|
|
// REQUIRES: swift_feature_CustomAvailability
|
|
|
|
// 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 @$sSo27available_in_enabled_domainyyFTo
|
|
|
|
// CHECK: [[FALSE_BB]]:
|
|
// CHECK: function_ref @$sSo29unavailable_in_enabled_domainyyFTo
|
|
if #available(EnabledDomain) {
|
|
available_in_enabled_domain()
|
|
} else {
|
|
unavailable_in_enabled_domain()
|
|
}
|
|
}
|
|
// 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 @$sSo29unavailable_in_enabled_domainyyFTo
|
|
|
|
// CHECK: [[FALSE_BB]]:
|
|
// CHECK: function_ref @$sSo27available_in_enabled_domainyyFTo
|
|
if #unavailable(EnabledDomain) {
|
|
unavailable_in_enabled_domain()
|
|
} else {
|
|
available_in_enabled_domain()
|
|
}
|
|
}
|
|
// CHECK: end sil function '$s4Test30testIfUnavailableEnabledDomainyyF'
|
|
|
|
// 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 @$sSo28available_in_disabled_domainyyFTo
|
|
|
|
// CHECK: [[FALSE_BB]]:
|
|
// CHECK: function_ref @$sSo30unavailable_in_disabled_domainyyFTo
|
|
if #available(DisabledDomain) {
|
|
available_in_disabled_domain()
|
|
} else {
|
|
unavailable_in_disabled_domain()
|
|
}
|
|
}
|
|
// 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 @$sSo30unavailable_in_disabled_domainyyFTo
|
|
|
|
// CHECK: [[FALSE_BB]]:
|
|
// CHECK: function_ref @$sSo28available_in_disabled_domainyyFTo
|
|
if #unavailable(DisabledDomain) {
|
|
unavailable_in_disabled_domain()
|
|
} else {
|
|
available_in_disabled_domain()
|
|
}
|
|
}
|
|
// CHECK: end sil function '$s4Test31testIfUnavailableDisabledDomainyyF'
|
|
|
|
// CHECK-LABEL: sil{{.*}}$s4Test28testIfAvailableDynamicDomainyyF : $@convention(thin) () -> ()
|
|
public func testIfAvailableDynamicDomain() {
|
|
// CHECK: bb0:
|
|
// CHECK: [[QUERY_FUNC:%.*]] = function_ref @$sSC33__swift_DynamicDomain_isAvailableBi1_yF : $@convention(thin) () -> Builtin.Int1
|
|
// CHECK: [[QUERY_RESULT:%.*]] = apply [[QUERY_FUNC]]() : $@convention(thin) () -> Builtin.Int1
|
|
// CHECK: cond_br [[QUERY_RESULT]], [[TRUE_BB:bb[0-9]+]], [[FALSE_BB:bb[0-9]+]]
|
|
|
|
// CHECK: [[TRUE_BB]]:
|
|
// CHECK: function_ref @$sSo27available_in_dynamic_domainyyFTo
|
|
|
|
// CHECK: [[FALSE_BB]]:
|
|
// CHECK: function_ref @$sSo29unavailable_in_dynamic_domainyyFTo
|
|
if #available(DynamicDomain) {
|
|
available_in_dynamic_domain()
|
|
} else {
|
|
unavailable_in_dynamic_domain()
|
|
}
|
|
}
|
|
// CHECK: end sil function '$s4Test28testIfAvailableDynamicDomainyyF'
|
|
|
|
// CHECK-LABEL: sil hidden [ossa] @$sSC33__swift_DynamicDomain_isAvailableBi1_yF : $@convention(thin) () -> Builtin.Int1
|
|
// CHECK: bb0:
|
|
// CHECK: [[QUERY_FUNC:%.*]] = function_ref @$sSo27__DynamicDomain_isAvailableSbyFTo : $@convention(c) () -> Bool
|
|
// CHECK: [[QUERY_RESULT:%.*]] = apply [[QUERY_FUNC]]() : $@convention(c) () -> Bool
|
|
// CHECK: [[RESULT:%.*]] = struct_extract [[QUERY_RESULT]], #Bool._value
|
|
// CHECK: return [[RESULT]]
|
|
// CHECK: end sil function '$sSC33__swift_DynamicDomain_isAvailableBi1_yF'
|
|
|
|
// CHECK-LABEL: sil{{.*}}$s4Test30testIfUnavailableDynamicDomainyyF : $@convention(thin) () -> ()
|
|
public func testIfUnavailableDynamicDomain() {
|
|
// CHECK: bb0:
|
|
// CHECK: [[QUERY_FUNC:%.*]] = function_ref @$sSC33__swift_DynamicDomain_isAvailableBi1_yF : $@convention(thin) () -> Builtin.Int1
|
|
// CHECK: [[QUERY_RESULT:%.*]] = apply [[QUERY_FUNC]]() : $@convention(thin) () -> Builtin.Int1
|
|
// CHECK: [[MINUSONE:%.*]] = integer_literal $Builtin.Int1, -1
|
|
// CHECK: [[QUERY_INVERSION:%.*]] = builtin "xor_Int1"([[QUERY_RESULT]], [[MINUSONE]]) : $Builtin.Int1
|
|
// CHECK: cond_br [[QUERY_INVERSION]], [[TRUE_BB:bb[0-9]+]], [[FALSE_BB:bb[0-9]+]]
|
|
|
|
// CHECK: [[TRUE_BB]]:
|
|
// CHECK: function_ref @$sSo29unavailable_in_dynamic_domainyyFTo
|
|
|
|
// CHECK: [[FALSE_BB]]:
|
|
// CHECK: function_ref @$sSo27available_in_dynamic_domainyyFTo
|
|
if #unavailable(DynamicDomain) {
|
|
unavailable_in_dynamic_domain()
|
|
} else {
|
|
available_in_dynamic_domain()
|
|
}
|
|
}
|
|
// CHECK: end sil function '$s4Test30testIfUnavailableDynamicDomainyyF'
|