Files
swift-mirror/test/SILGen/availability_query_custom_domains_clang.swift
Xi Ge e31c1cc7f8 CustomAvailability: avoid exposing the synthesized function for dynamic availability checking as an API entry
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
2025-11-10 09:26:28 -08:00

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'