Skip to content

Commit 48a7d5b

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

File tree

3 files changed

+72
-2
lines changed

3 files changed

+72
-2
lines changed

lib/ClangImporter/SwiftDeclSynthesizer.cpp

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

31903190
ImporterImpl.availabilityDomainPredicates[var] = funcDecl;
31913191

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: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// RUN: %empty-directory(%t/mod)
2+
// 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
3+
// RUN: %target-swift-frontend -emit-module %s -o %t/mod/Foo.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
4+
5+
#if FOO
6+
7+
@available(DynamicDomain)
8+
public struct X {
9+
public init() { }
10+
}
11+
12+
public struct Z {
13+
public init() {
14+
if #available(DynamicDomain) {
15+
print("#available")
16+
print(X())
17+
} else {
18+
print("#unavailable")
19+
}
20+
}
21+
}
22+
23+
#endif
24+
25+
#if BAR
26+
27+
import Foo
28+
29+
public struct Y {
30+
init() {
31+
if #available(DynamicDomain) {
32+
print("#available")
33+
print(X())
34+
print(Z())
35+
} else {
36+
print("#unavailable")
37+
print(Z())
38+
}
39+
}
40+
41+
}
42+
#endif

0 commit comments

Comments
 (0)