Skip to content

Commit b3246a4

Browse files
committed
CustomAvailability: avoid exposing the synthesized function of dynamic availability checking as an API entry
When exposing the function body of the synthesized function that checks whether a dynamic domain is available, the downstream client may hit a deserialization issue.
1 parent 6b5abb6 commit b3246a4

File tree

4 files changed

+73
-4
lines changed

4 files changed

+73
-4
lines changed

lib/ClangImporter/SwiftDeclSynthesizer.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3183,9 +3183,7 @@ FuncDecl *SwiftDeclSynthesizer::makeAvailabilityDomainPredicate(
31833183
BuiltinIntegerType::get(1, ctx), ImporterImpl.ImportedHeaderUnit);
31843184
funcDecl->setBodySynthesizer(synthesizeAvailabilityDomainPredicateBody,
31853185
(void *)var);
3186-
funcDecl->setAccess(AccessLevel::Public);
3187-
funcDecl->addAttribute(
3188-
new (ctx) ExportAttr(ExportKind::Implementation, /*IsImplicit=*/true));
3186+
funcDecl->setAccess(AccessLevel::Internal);
31893187

31903188
ImporterImpl.availabilityDomainPredicates[var] = funcDecl;
31913189

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#include <availability_domain.h>
2+
3+
int dynamic_domain_pred();
4+
5+
CLANG_ENABLED_AVAILABILITY_DOMAIN(EnabledDomain);
6+
CLANG_DISABLED_AVAILABILITY_DOMAIN(DisabledDomain);
7+
CLANG_DYNAMIC_AVAILABILITY_DOMAIN(DynamicDomain, dynamic_domain_pred);
8+
9+
#define AVAIL 0
10+
#define UNAVAIL 1
11+
12+
__attribute__((availability(domain : EnabledDomain, AVAIL))) void
13+
available_in_enabled_domain(void);
14+
15+
__attribute__((availability(domain : EnabledDomain, UNAVAIL))) void
16+
unavailable_in_enabled_domain(void);
17+
18+
__attribute__((availability(domain : DisabledDomain, AVAIL))) void
19+
available_in_disabled_domain(void);
20+
21+
__attribute__((availability(domain : DisabledDomain, UNAVAIL))) void
22+
unavailable_in_disabled_domain(void);
23+
24+
__attribute__((availability(domain : DynamicDomain, AVAIL))) void
25+
available_in_dynamic_domain(void);
26+
27+
__attribute__((availability(domain : DynamicDomain, UNAVAIL))) void
28+
unavailable_in_dynamic_domain(void);
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// REQUIRES: swift_feature_CustomAvailability
2+
// RUN: %empty-directory(%t/mod)
3+
// 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
4+
// 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
5+
6+
#if FOO
7+
8+
@available(DynamicDomain)
9+
public struct X {
10+
public init() { }
11+
}
12+
13+
public struct Z {
14+
public init() {
15+
if #available(DynamicDomain) {
16+
print("#available")
17+
print(X())
18+
} else {
19+
print("#unavailable")
20+
}
21+
}
22+
}
23+
24+
#endif
25+
26+
#if BAR
27+
28+
import Foo
29+
30+
public struct Y {
31+
init() {
32+
if #available(DynamicDomain) {
33+
print("#available")
34+
print(X())
35+
print(Z())
36+
} else {
37+
print("#unavailable")
38+
print(Z())
39+
}
40+
}
41+
42+
}
43+
#endif

test/SILGen/availability_query_custom_domains_clang.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public func testIfAvailableDynamicDomain() {
101101
}
102102
// CHECK: end sil function '$s4Test28testIfAvailableDynamicDomainyyF'
103103

104-
// CHECK-LABEL: sil non_abi [serialized] [ossa] @$sSC33__swift_DynamicDomain_isAvailableBi1_yF : $@convention(thin) () -> Builtin.Int1
104+
// CHECK-LABEL: sil hidden [ossa] @$sSC33__swift_DynamicDomain_isAvailableBi1_yF : $@convention(thin) () -> Builtin.Int1
105105
// CHECK: bb0:
106106
// CHECK: [[QUERY_FUNC:%.*]] = function_ref @$sSo27__DynamicDomain_isAvailableSbyFTo : $@convention(c) () -> Bool
107107
// CHECK: [[QUERY_RESULT:%.*]] = apply [[QUERY_FUNC]]() : $@convention(c) () -> Bool

0 commit comments

Comments
 (0)