1
1
// RUN: %target-typecheck-verify-swift \
2
2
// RUN: -enable-experimental-feature CustomAvailability \
3
3
// RUN: -define-enabled-availability-domain EnabledDomain \
4
+ // RUN: -define-always-enabled-availability-domain AlwaysEnabledDomain \
4
5
// RUN: -define-disabled-availability-domain DisabledDomain \
5
6
// RUN: -define-dynamic-availability-domain DynamicDomain
6
7
@@ -11,9 +12,15 @@ func alwaysAvailable() { }
11
12
@available ( EnabledDomain)
12
13
func availableInEnabledDomain( ) { }
13
14
15
+ @available ( AlwaysEnabledDomain)
16
+ func availableInAlwaysEnabledDomain( ) { }
17
+
14
18
@available ( EnabledDomain, unavailable)
15
19
func unavailableInEnabledDomain( ) { } // expected-note * {{'unavailableInEnabledDomain()' has been explicitly marked unavailable here}}
16
20
21
+ @available ( AlwaysEnabledDomain, unavailable)
22
+ func unavailableInAlwaysEnabledDomain( ) { } // expected-note * {{'unavailableInAlwaysEnabledDomain()' has been explicitly marked unavailable here}}
23
+
17
24
@available ( DisabledDomain, unavailable)
18
25
func unavailableInDisabledDomain( ) { } // expected-note * {{'unavailableInDisabledDomain()' has been explicitly marked unavailable here}}
19
26
@@ -41,7 +48,9 @@ func testDeployment() { // expected-note 3 {{add '@available' attribute to enclo
41
48
alwaysAvailable ( )
42
49
availableInEnabledDomain ( ) // expected-error {{'availableInEnabledDomain()' is only available in EnabledDomain}}
43
50
// expected-note@-1 {{add 'if #available' version check}}
51
+ availableInAlwaysEnabledDomain ( )
44
52
unavailableInEnabledDomain ( ) // expected-error {{'unavailableInEnabledDomain()' is unavailable}}
53
+ unavailableInAlwaysEnabledDomain ( ) // expected-error {{'unavailableInAlwaysEnabledDomain()' is unavailable}}
45
54
unavailableInDisabledDomain ( ) // expected-error {{'unavailableInDisabledDomain()' is unavailable}}
46
55
deprecatedInDynamicDomain ( ) // expected-warning {{'deprecatedInDynamicDomain()' is deprecated: Use something else}}
47
56
unavailableInDynamicDomain ( ) // expected-error {{'unavailableInDynamicDomain()' is unavailable}}
@@ -53,10 +62,14 @@ func testDeployment() { // expected-note 3 {{add '@available' attribute to enclo
53
62
availableAndUnavailableInEnabledDomain ( ) // expected-error {{'availableAndUnavailableInEnabledDomain()' is unavailable}}
54
63
}
55
64
65
+ // FIXME: [availability] Test @inlinable functions.
66
+
56
67
func testIfAvailable( _ truthy: Bool ) { // expected-note 9 {{add '@available' attribute to enclosing global function}}
57
68
if #available( EnabledDomain) { // expected-note {{enclosing scope here}}
58
69
availableInEnabledDomain ( )
70
+ availableInAlwaysEnabledDomain ( )
59
71
unavailableInEnabledDomain ( ) // expected-error {{'unavailableInEnabledDomain()' is unavailable}}
72
+ unavailableInAlwaysEnabledDomain ( ) // expected-error {{'unavailableInAlwaysEnabledDomain()' is unavailable}}
60
73
availableInDynamicDomain ( ) // expected-error {{'availableInDynamicDomain()' is only available in DynamicDomain}}
61
74
// expected-note@-1 {{add 'if #available' version check}}
62
75
unavailableInDynamicDomain ( ) // expected-error {{'unavailableInDynamicDomain()' is unavailable}}
@@ -133,6 +146,14 @@ func testIfAvailable(_ truthy: Bool) { // expected-note 9 {{add '@available' att
133
146
if #unavailable( EnabledDomain) , #available( DynamicDomain) {
134
147
// expected-error@-1 {{#available and #unavailable cannot be in the same statement}}
135
148
}
149
+
150
+ if #available( AlwaysEnabledDomain) {
151
+ availableInAlwaysEnabledDomain ( )
152
+ unavailableInAlwaysEnabledDomain ( ) // expected-error {{'unavailableInAlwaysEnabledDomain()' is unavailable}}
153
+ } else {
154
+ availableInAlwaysEnabledDomain ( )
155
+ unavailableInAlwaysEnabledDomain ( )
156
+ }
136
157
}
137
158
138
159
func testWhileAvailable( ) { // expected-note {{add '@available' attribute to enclosing global function}}
@@ -207,13 +228,28 @@ func testEnabledDomainUnavailable() { // expected-note {{add '@available' attrib
207
228
availableInUnknownDomain ( )
208
229
}
209
230
231
+ @available ( AlwaysEnabledDomain)
232
+ func testAlwaysEnabledDomainAvailable( ) {
233
+ availableInAlwaysEnabledDomain ( )
234
+ unavailableInAlwaysEnabledDomain ( ) // expected-error {{'unavailableInAlwaysEnabledDomain()' is unavailable}}
235
+ }
236
+
237
+ @available ( AlwaysEnabledDomain, unavailable)
238
+ func testAlwaysEnabledDomainUnavailable( ) {
239
+ availableInAlwaysEnabledDomain ( )
240
+ unavailableInAlwaysEnabledDomain ( )
241
+ }
242
+
210
243
@available ( * , unavailable)
211
244
func testUniversallyUnavailable( ) {
212
245
alwaysAvailable ( )
213
246
// FIXME: [availability] Diagnostic consistency: potentially unavailable declaration shouldn't be diagnosed
214
247
// in contexts that are unavailable to broader domains
215
248
availableInEnabledDomain ( ) // expected-error {{'availableInEnabledDomain()' is only available in EnabledDomain}}
216
249
// expected-note@-1 {{add 'if #available' version check}}
250
+ unavailableInEnabledDomain ( )
251
+ availableInAlwaysEnabledDomain ( )
252
+ unavailableInAlwaysEnabledDomain ( )
217
253
unavailableInDisabledDomain ( )
218
254
deprecatedInDynamicDomain ( ) // expected-warning {{'deprecatedInDynamicDomain()' is deprecated: Use something else}}
219
255
availableInDynamicDomain ( ) // expected-error {{'availableInDynamicDomain()' is only available in DynamicDomain}}
0 commit comments