11// RUN: %target-typecheck-verify-swift \
22// RUN: -enable-experimental-feature CustomAvailability \
33// RUN: -define-enabled-availability-domain EnabledDomain \
4+ // RUN: -define-always-enabled-availability-domain AlwaysEnabledDomain \
45// RUN: -define-disabled-availability-domain DisabledDomain \
56// RUN: -define-dynamic-availability-domain DynamicDomain
67
@@ -11,9 +12,15 @@ func alwaysAvailable() { }
1112@available ( EnabledDomain)
1213func availableInEnabledDomain( ) { }
1314
15+ @available ( AlwaysEnabledDomain)
16+ func availableInAlwaysEnabledDomain( ) { }
17+
1418@available ( EnabledDomain, unavailable)
1519func unavailableInEnabledDomain( ) { } // expected-note * {{'unavailableInEnabledDomain()' has been explicitly marked unavailable here}}
1620
21+ @available ( AlwaysEnabledDomain, unavailable)
22+ func unavailableInAlwaysEnabledDomain( ) { } // expected-note * {{'unavailableInAlwaysEnabledDomain()' has been explicitly marked unavailable here}}
23+
1724@available ( DisabledDomain, unavailable)
1825func unavailableInDisabledDomain( ) { } // expected-note * {{'unavailableInDisabledDomain()' has been explicitly marked unavailable here}}
1926
@@ -41,7 +48,9 @@ func testDeployment() { // expected-note 3 {{add '@available' attribute to enclo
4148 alwaysAvailable ( )
4249 availableInEnabledDomain ( ) // expected-error {{'availableInEnabledDomain()' is only available in EnabledDomain}}
4350 // expected-note@-1 {{add 'if #available' version check}}
51+ availableInAlwaysEnabledDomain ( )
4452 unavailableInEnabledDomain ( ) // expected-error {{'unavailableInEnabledDomain()' is unavailable}}
53+ unavailableInAlwaysEnabledDomain ( ) // expected-error {{'unavailableInAlwaysEnabledDomain()' is unavailable}}
4554 unavailableInDisabledDomain ( ) // expected-error {{'unavailableInDisabledDomain()' is unavailable}}
4655 deprecatedInDynamicDomain ( ) // expected-warning {{'deprecatedInDynamicDomain()' is deprecated: Use something else}}
4756 unavailableInDynamicDomain ( ) // expected-error {{'unavailableInDynamicDomain()' is unavailable}}
@@ -53,10 +62,14 @@ func testDeployment() { // expected-note 3 {{add '@available' attribute to enclo
5362 availableAndUnavailableInEnabledDomain ( ) // expected-error {{'availableAndUnavailableInEnabledDomain()' is unavailable}}
5463}
5564
65+ // FIXME: [availability] Test @inlinable functions.
66+
5667func testIfAvailable( _ truthy: Bool ) { // expected-note 9 {{add '@available' attribute to enclosing global function}}
5768 if #available( EnabledDomain) { // expected-note {{enclosing scope here}}
5869 availableInEnabledDomain ( )
70+ availableInAlwaysEnabledDomain ( )
5971 unavailableInEnabledDomain ( ) // expected-error {{'unavailableInEnabledDomain()' is unavailable}}
72+ unavailableInAlwaysEnabledDomain ( ) // expected-error {{'unavailableInAlwaysEnabledDomain()' is unavailable}}
6073 availableInDynamicDomain ( ) // expected-error {{'availableInDynamicDomain()' is only available in DynamicDomain}}
6174 // expected-note@-1 {{add 'if #available' version check}}
6275 unavailableInDynamicDomain ( ) // expected-error {{'unavailableInDynamicDomain()' is unavailable}}
@@ -133,6 +146,14 @@ func testIfAvailable(_ truthy: Bool) { // expected-note 9 {{add '@available' att
133146 if #unavailable( EnabledDomain) , #available( DynamicDomain) {
134147 // expected-error@-1 {{#available and #unavailable cannot be in the same statement}}
135148 }
149+
150+ if #available( AlwaysEnabledDomain) {
151+ availableInAlwaysEnabledDomain ( )
152+ unavailableInAlwaysEnabledDomain ( ) // expected-error {{'unavailableInAlwaysEnabledDomain()' is unavailable}}
153+ } else {
154+ availableInAlwaysEnabledDomain ( )
155+ unavailableInAlwaysEnabledDomain ( )
156+ }
136157}
137158
138159func testWhileAvailable( ) { // expected-note {{add '@available' attribute to enclosing global function}}
@@ -207,13 +228,28 @@ func testEnabledDomainUnavailable() { // expected-note {{add '@available' attrib
207228 availableInUnknownDomain ( )
208229}
209230
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+
210243@available ( * , unavailable)
211244func testUniversallyUnavailable( ) {
212245 alwaysAvailable ( )
213246 // FIXME: [availability] Diagnostic consistency: potentially unavailable declaration shouldn't be diagnosed
214247 // in contexts that are unavailable to broader domains
215248 availableInEnabledDomain ( ) // expected-error {{'availableInEnabledDomain()' is only available in EnabledDomain}}
216249 // expected-note@-1 {{add 'if #available' version check}}
250+ unavailableInEnabledDomain ( )
251+ availableInAlwaysEnabledDomain ( )
252+ unavailableInAlwaysEnabledDomain ( )
217253 unavailableInDisabledDomain ( )
218254 deprecatedInDynamicDomain ( ) // expected-warning {{'deprecatedInDynamicDomain()' is deprecated: Use something else}}
219255 availableInDynamicDomain ( ) // expected-error {{'availableInDynamicDomain()' is only available in DynamicDomain}}
0 commit comments