mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
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
This commit is contained in:
33
test/Availability/Inputs/AvailabilityDomains.h
Normal file
33
test/Availability/Inputs/AvailabilityDomains.h
Normal file
@@ -0,0 +1,33 @@
|
||||
#ifndef __AVAILABILITY_DOMAIN_TEST_H
|
||||
#define __AVAILABILITY_DOMAIN_TEST_H
|
||||
|
||||
#include <availability_domain.h>
|
||||
|
||||
int dynamic_domain_pred();
|
||||
|
||||
CLANG_ENABLED_AVAILABILITY_DOMAIN(EnabledDomain);
|
||||
CLANG_DISABLED_AVAILABILITY_DOMAIN(DisabledDomain);
|
||||
CLANG_DYNAMIC_AVAILABILITY_DOMAIN(DynamicDomain, dynamic_domain_pred);
|
||||
|
||||
#define AVAIL 0
|
||||
#define UNAVAIL 1
|
||||
|
||||
__attribute__((availability(domain : EnabledDomain, AVAIL))) void
|
||||
available_in_enabled_domain(void);
|
||||
|
||||
__attribute__((availability(domain : EnabledDomain, UNAVAIL))) void
|
||||
unavailable_in_enabled_domain(void);
|
||||
|
||||
__attribute__((availability(domain : DisabledDomain, AVAIL))) void
|
||||
available_in_disabled_domain(void);
|
||||
|
||||
__attribute__((availability(domain : DisabledDomain, UNAVAIL))) void
|
||||
unavailable_in_disabled_domain(void);
|
||||
|
||||
__attribute__((availability(domain : DynamicDomain, AVAIL))) void
|
||||
available_in_dynamic_domain(void);
|
||||
|
||||
__attribute__((availability(domain : DynamicDomain, UNAVAIL))) void
|
||||
unavailable_in_dynamic_domain(void);
|
||||
|
||||
#endif // __AVAILABILITY_DOMAIN_TEST_H
|
||||
@@ -0,0 +1,43 @@
|
||||
// REQUIRES: swift_feature_CustomAvailability
|
||||
// RUN: %empty-directory(%t/mod)
|
||||
// RUN: %target-swift-frontend -emit-module %s -o %t/mod/Foo.swiftmodule -parse-as-library -enable-library-evolution -module-name Foo -import-bridging-header %S/Inputs/AvailabilityDomains.h -enable-experimental-feature CustomAvailability -D FOO
|
||||
// RUN: %target-swift-frontend -emit-module %s -o %t/mod/Bar.swiftmodule -parse-as-library -enable-library-evolution -module-name Bar -import-bridging-header %S/Inputs/AvailabilityDomains.h -enable-experimental-feature CustomAvailability -I %t/mod -D BAR
|
||||
|
||||
#if FOO
|
||||
|
||||
@available(DynamicDomain)
|
||||
public struct X {
|
||||
public init() { }
|
||||
}
|
||||
|
||||
public struct Z {
|
||||
public init() {
|
||||
if #available(DynamicDomain) {
|
||||
print("#available")
|
||||
print(X())
|
||||
} else {
|
||||
print("#unavailable")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if BAR
|
||||
|
||||
import Foo
|
||||
|
||||
public struct Y {
|
||||
init() {
|
||||
if #available(DynamicDomain) {
|
||||
print("#available")
|
||||
print(X())
|
||||
print(Z())
|
||||
} else {
|
||||
print("#unavailable")
|
||||
print(Z())
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
Reference in New Issue
Block a user