// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck -verify -verify-ignore-unrelated \ // RUN: -import-objc-header %S/Inputs/availability_domains_bridging_header.h \ // RUN: -I %S/../Inputs/custom-modules/availability-domains \ // RUN: -enable-experimental-feature CustomAvailability \ // RUN: -experimental-spi-only-imports -parse-as-library -swift-version 4 \ // RUN: %s // RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck -verify -verify-ignore-unrelated \ // RUN: -import-objc-header %S/Inputs/availability_domains_bridging_header.h \ // RUN: -I %S/../Inputs/custom-modules/availability-domains \ // RUN: -enable-experimental-feature CustomAvailability \ // RUN: -experimental-spi-only-imports -parse-as-library -swift-version 5 \ // RUN: %s -verify-additional-prefix swift5- // REQUIRES: swift_feature_CustomAvailability private import Rivers // also re-exported by Oceans internal import Oceans // expected-note@-1 23 {{availability domain 'Arctic' imported as 'internal' from 'Oceans' here}} // expected-swift5-note@-2 2 {{availability domain 'Arctic' imported as 'internal' from 'Oceans' here}} // expected-note@-3 24 {{availability domain 'Colorado' imported as 'internal' from 'Oceans' here}} // expected-swift5-note@-4 2 {{availability domain 'Colorado' imported as 'internal' from 'Oceans' here}} // expected-note@-5 23 {{availability domain 'Grand' imported as 'internal' from 'Oceans' here}} // expected-swift5-note@-6 2 {{availability domain 'Grand' imported as 'internal' from 'Oceans' here}} public import Seas @_spiOnly import Lakes @available(Colorado) // expected-error {{availability domain 'Colorado' is internal and cannot be used in '@available' on public global function 'publicFunc()'}} @available(Grand) // expected-error {{availability domain 'Grand' is internal and cannot be used in '@available' on public global function 'publicFunc()'}} // expected-warning@-1 {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) // expected-error {{availability domain 'Arctic' is internal and cannot be used in '@available' on public global function 'publicFunc()'}} @available(Baltic) @available(BayBridge) @available(Salt) // expected-error {{cannot use availability domain 'Salt' in an '@available' attribute here; 'Lakes' was imported for SPI only}} public func publicFunc() { } @available(Colorado) // expected-swift5-error {{availability domain 'Colorado' used in '@available' on global function 'usableFromInlineFunc()' must be '@usableFromInline' or public}} @available(Grand) // expected-swift5-error {{availability domain 'Grand' used in '@available' on global function 'usableFromInlineFunc()' must be '@usableFromInline' or public}} // expected-warning@-1 {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) // expected-swift5-error {{availability domain 'Arctic' used in '@available' on global function 'usableFromInlineFunc()' must be '@usableFromInline' or public}} @available(Baltic) @available(BayBridge) @available(Salt) // expected-error {{cannot use availability domain 'Salt' in an '@available' attribute here; 'Lakes' was imported for SPI only}} @usableFromInline func usableFromInlineFunc() { } @available(Colorado) // expected-error {{availability domain 'Colorado' is internal and cannot be used in '@available' on public global function 'spiFunc()'}} @available(Grand) // expected-error {{availability domain 'Grand' is internal and cannot be used in '@available' on public global function 'spiFunc()'}} // expected-warning@-1 {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) // expected-error {{availability domain 'Arctic' is internal and cannot be used in '@available' on public global function 'spiFunc()'}} @available(Baltic) @available(BayBridge) @available(Salt) @_spi(Private) public func spiFunc() { } @available(Colorado) @available(Grand) // expected-warning {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) @available(Baltic) @available(BayBridge) @available(Salt) func internalFunc() { } @available(Colorado) @available(Grand) // expected-warning {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) @available(Baltic) @available(BayBridge) @available(Salt) private func privateFunc() { } @available(Colorado) // expected-error {{availability domain 'Colorado' is internal and cannot be used in '@available' on public var 'publicGlobalVar'}} @available(Grand) // expected-error {{availability domain 'Grand' is internal and cannot be used in '@available' on public var 'publicGlobalVar'}} // expected-warning@-1 {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) // expected-error {{availability domain 'Arctic' is internal and cannot be used in '@available' on public var 'publicGlobalVar'}} @available(Baltic) @available(BayBridge) @available(Salt) // expected-error {{cannot use availability domain 'Salt' in an '@available' attribute here; 'Lakes' was imported for SPI only}} public var publicGlobalVar: Int { get { 0 } set { } } @available(Colorado) // expected-error {{availability domain 'Colorado' is internal and cannot be used in '@available' on public struct 'PublicStruct'}} @available(Grand) // expected-error {{availability domain 'Grand' is internal and cannot be used in '@available' on public struct 'PublicStruct'}} // expected-warning@-1 {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) // expected-error {{availability domain 'Arctic' is internal and cannot be used in '@available' on public struct 'PublicStruct'}} @available(Baltic) @available(BayBridge) @available(Salt) // expected-error {{cannot use availability domain 'Salt' in an '@available' attribute here; 'Lakes' was imported for SPI only}} public struct PublicStruct { } public struct PublicGenericStruct { var value: T @available(Colorado) // expected-error {{availability domain 'Colorado' is internal and cannot be used in '@available' on public initializer 'init(value:)'}} @available(Grand) // expected-error {{availability domain 'Grand' is internal and cannot be used in '@available' on public initializer 'init(value:)'}} // expected-warning@-1 {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) // expected-error {{availability domain 'Arctic' is internal and cannot be used in '@available' on public initializer 'init(value:)'}} @available(Baltic) @available(BayBridge) @available(Salt) // expected-error {{cannot use availability domain 'Salt' in an '@available' attribute here; 'Lakes' was imported for SPI only}} public init(value: T) { self.value = value } @available(Colorado) // expected-error {{availability domain 'Colorado' is internal and cannot be used in '@available' on public property 'publicProperty'}} @available(Grand) // expected-error {{availability domain 'Grand' is internal and cannot be used in '@available' on public property 'publicProperty'}} // expected-warning@-1 {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) // expected-error {{availability domain 'Arctic' is internal and cannot be used in '@available' on public property 'publicProperty'}} @available(Baltic) @available(BayBridge) @available(Salt) // expected-error {{cannot use availability domain 'Salt' in an '@available' attribute here; 'Lakes' was imported for SPI only}} public var publicProperty: T { value } @available(Colorado) // expected-swift5-error {{availability domain 'Colorado' used in '@available' on property 'usableFromInlineProperty' must be '@usableFromInline' or public}} @available(Grand) // expected-swift5-error {{availability domain 'Grand' used in '@available' on property 'usableFromInlineProperty' must be '@usableFromInline' or public}} // expected-warning@-1 {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) // expected-swift5-error {{availability domain 'Arctic' used in '@available' on property 'usableFromInlineProperty' must be '@usableFromInline' or public}} @available(Baltic) @available(BayBridge) @available(Salt) // expected-error {{cannot use availability domain 'Salt' in an '@available' attribute here; 'Lakes' was imported for SPI only}} @usableFromInline var usableFromInlineProperty: T { value } public var publicPropertyWithSetter: T { get { value } @available(Colorado) // expected-error {{availability domain 'Colorado' is internal and cannot be used in '@available' on public setter for property 'publicPropertyWithSetter'}} @available(Grand) // expected-error {{availability domain 'Grand' is internal and cannot be used in '@available' on public setter for property 'publicPropertyWithSetter'}} // expected-warning@-1 {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) // expected-error {{availability domain 'Arctic' is internal and cannot be used in '@available' on public setter for property 'publicPropertyWithSetter'}} @available(Baltic) @available(BayBridge) @available(Salt) // expected-error {{cannot use availability domain 'Salt' in an '@available' attribute here; 'Lakes' was imported for SPI only}} set { value = newValue } } @available(Colorado) // expected-error {{availability domain 'Colorado' is internal and cannot be used in '@available' on public instance method 'publicMethod()'}} @available(Grand) // expected-error {{availability domain 'Grand' is internal and cannot be used in '@available' on public instance method 'publicMethod()'}} // expected-warning@-1 {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) // expected-error {{availability domain 'Arctic' is internal and cannot be used in '@available' on public instance method 'publicMethod()'}} @available(Baltic) @available(BayBridge) @available(Salt) // expected-error {{cannot use availability domain 'Salt' in an '@available' attribute here; 'Lakes' was imported for SPI only}} public func publicMethod() { } @available(Colorado) // expected-error {{availability domain 'Colorado' is internal and cannot be used in '@available' on public subscript 'subscript(_:)'}} @available(Colorado) // expected-error {{availability domain 'Colorado' is internal and cannot be used in '@available' on public subscript 'subscript(_:)'}} @available(Grand) // expected-error {{availability domain 'Grand' is internal and cannot be used in '@available' on public subscript 'subscript(_:)'}} // expected-warning@-1 {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) // expected-error {{availability domain 'Arctic' is internal and cannot be used in '@available' on public subscript 'subscript(_:)'}} @available(Baltic) @available(BayBridge) @available(Salt) // expected-error {{cannot use availability domain 'Salt' in an '@available' attribute here; 'Lakes' was imported for SPI only}} public subscript(indexForSubscriptInColorado: T) -> T { value } } @available(Colorado) // expected-error {{availability domain 'Colorado' is internal and cannot be used in '@available' on public enum 'PublicEnum'}} @available(Grand) // expected-error {{availability domain 'Grand' is internal and cannot be used in '@available' on public enum 'PublicEnum'}} // expected-warning@-1 {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) // expected-error {{availability domain 'Arctic' is internal and cannot be used in '@available' on public enum 'PublicEnum'}} @available(Baltic) @available(BayBridge) @available(Salt) // expected-error {{cannot use availability domain 'Salt' in an '@available' attribute here; 'Lakes' was imported for SPI only}} public enum PublicEnum { } public enum PublicEnumWithCase { @available(Colorado) // expected-error {{availability domain 'Colorado' is internal and cannot be used in '@available' on public enum case 'colorado'}} @available(Grand) // expected-error {{availability domain 'Grand' is internal and cannot be used in '@available' on public enum case 'colorado'}} // expected-warning@-1 {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) // expected-error {{availability domain 'Arctic' is internal and cannot be used in '@available' on public enum case 'colorado'}} @available(Baltic) @available(BayBridge) @available(Salt) // expected-error {{cannot use availability domain 'Salt' in an '@available' attribute here; 'Lakes' was imported for SPI only}} case colorado } @available(Colorado) // expected-error {{availability domain 'Colorado' is internal and cannot be used in '@available' on public class 'PublicClass'}} @available(Grand) // expected-error {{availability domain 'Grand' is internal and cannot be used in '@available' on public class 'PublicClass'}} // expected-warning@-1 {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) // expected-error {{availability domain 'Arctic' is internal and cannot be used in '@available' on public class 'PublicClass'}} @available(Baltic) @available(BayBridge) @available(Salt) // expected-error {{cannot use availability domain 'Salt' in an '@available' attribute here; 'Lakes' was imported for SPI only}} public class PublicClass { } @available(Colorado) // expected-error {{availability domain 'Colorado' is internal and cannot be used in '@available' on public protocol 'PublicProtocol'}} @available(Grand) // expected-error {{availability domain 'Grand' is internal and cannot be used in '@available' on public protocol 'PublicProtocol'}} // expected-warning@-1 {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) // expected-error {{availability domain 'Arctic' is internal and cannot be used in '@available' on public protocol 'PublicProtocol'}} @available(Baltic) @available(BayBridge) @available(Salt) // expected-error {{cannot use availability domain 'Salt' in an '@available' attribute here; 'Lakes' was imported for SPI only}} public protocol PublicProtocol { } public protocol PublicProtocolWithAssociatedType { @available(Colorado) // expected-error {{availability domain 'Colorado' is internal and cannot be used in '@available' on public associated type 'AssociatedType'}} @available(Grand) // expected-error {{availability domain 'Grand' is internal and cannot be used in '@available' on public associated type 'AssociatedType'}} // expected-warning@-1 {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) // expected-error {{availability domain 'Arctic' is internal and cannot be used in '@available' on public associated type 'AssociatedType'}} @available(Baltic) @available(BayBridge) @available(Salt) // expected-error {{cannot use availability domain 'Salt' in an '@available' attribute here; 'Lakes' was imported for SPI only}} associatedtype AssociatedType @available(Colorado) // expected-error {{availability domain 'Colorado' is internal and cannot be used in '@available' on public instance method 'requirement()'}} @available(Grand) // expected-error {{availability domain 'Grand' is internal and cannot be used in '@available' on public instance method 'requirement()'}} // expected-warning@-1 {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) // expected-error {{availability domain 'Arctic' is internal and cannot be used in '@available' on public instance method 'requirement()'}} @available(Baltic) @available(BayBridge) @available(Salt) // expected-error {{cannot use availability domain 'Salt' in an '@available' attribute here; 'Lakes' was imported for SPI only}} func requirement() -> AssociatedType } @available(Colorado) // expected-error {{availability domain 'Colorado' is internal and cannot be used in '@available' on public type alias 'PublicTypealias'}} @available(Grand) // expected-error {{availability domain 'Grand' is internal and cannot be used in '@available' on public type alias 'PublicTypealias'}} // expected-warning@-1 {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) // expected-error {{availability domain 'Arctic' is internal and cannot be used in '@available' on public type alias 'PublicTypealias'}} @available(Baltic) @available(BayBridge) @available(Salt) // expected-error {{cannot use availability domain 'Salt' in an '@available' attribute here; 'Lakes' was imported for SPI only}} public typealias PublicTypealias = Int @available(Colorado) @available(Grand) // expected-warning {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) @available(Baltic) @available(BayBridge) @available(Salt) extension PublicGenericStruct { } @available(Colorado) // expected-error {{availability domain 'Colorado' is internal and cannot be used in '@available' on public extension of generic struct 'PublicGenericStruct'}} @available(Grand) // expected-error {{availability domain 'Grand' is internal and cannot be used in '@available' on public extension of generic struct 'PublicGenericStruct'}} // expected-warning@-1 {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) // expected-error {{availability domain 'Arctic' is internal and cannot be used in '@available' on public extension of generic struct 'PublicGenericStruct'}} @available(Baltic) @available(BayBridge) @available(Salt) public extension PublicGenericStruct { } @available(Colorado) // expected-error {{availability domain 'Colorado' is internal and cannot be used in '@available' on public extension of generic struct 'PublicGenericStruct'}} @available(Grand) // expected-error {{availability domain 'Grand' is internal and cannot be used in '@available' on public extension of generic struct 'PublicGenericStruct'}} // expected-warning@-1 {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) // expected-error {{availability domain 'Arctic' is internal and cannot be used in '@available' on public extension of generic struct 'PublicGenericStruct'}} @available(Baltic) @available(BayBridge) @available(Salt) // expected-error {{cannot use availability domain 'Salt' in an '@available' attribute here; 'Lakes' was imported for SPI only}} public extension PublicGenericStruct { func publicMemberOfPublicExtension() { } } @available(Colorado) @available(Grand) // expected-warning {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) @available(Baltic) @available(BayBridge) @available(Salt) extension PublicGenericStruct { func internalMethodInExtensionInColorado() { } } @available(Colorado) // expected-error {{cannot use availability domain 'Colorado' in an '@available' attribute here; 'Rivers' was not imported publicly}} @available(Grand) // expected-error {{cannot use availability domain 'Grand' in an '@available' attribute here; 'Rivers' was not imported publicly}} @available(Arctic) // expected-error {{cannot use availability domain 'Arctic' in an '@available' attribute here; 'Oceans' was not imported publicly}} @available(Baltic) @available(BayBridge) @available(Salt) // expected-error {{cannot use availability domain 'Salt' in an '@available' attribute here; 'Lakes' was imported for SPI only}} extension PublicGenericStruct { public func publicMethodInExtensionInColorado() { } } @available(Colorado) @available(Grand) // expected-warning {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) @available(Baltic) @available(BayBridge) @available(Salt) extension PublicGenericStruct where T: PublicProtocolWithAssociatedType { } @available(Colorado) // expected-error {{cannot use availability domain 'Colorado' in an '@available' attribute here; 'Rivers' was not imported publicly}} @available(Grand) // expected-error {{cannot use availability domain 'Grand' in an '@available' attribute here; 'Rivers' was not imported publicly}} @available(Arctic) // expected-error {{cannot use availability domain 'Arctic' in an '@available' attribute here; 'Oceans' was not imported publicly}} @available(Baltic) @available(BayBridge) @available(Salt) // expected-error {{cannot use availability domain 'Salt' in an '@available' attribute here; 'Lakes' was imported for SPI only}} extension PublicGenericStruct: PublicProtocol {} @available(Colorado) // expected-error {{cannot use availability domain 'Colorado' in an '@available' attribute here; 'Rivers' was not imported publicly}} @available(Grand) // expected-error {{cannot use availability domain 'Grand' in an '@available' attribute here; 'Rivers' was not imported publicly}} @available(Arctic) // expected-error {{cannot use availability domain 'Arctic' in an '@available' attribute here; 'Oceans' was not imported publicly}} @available(Baltic) @available(BayBridge) @available(Salt) // expected-error {{cannot use availability domain 'Salt' in an '@available' attribute here; 'Lakes' was imported for SPI only}} extension PublicGenericStruct: PublicProtocolWithAssociatedType { public func requirement() -> Int { 0 } } @inlinable public func inlinableFunc() { if #available(Colorado) { } // expected-error {{availability domain 'Colorado' is internal and cannot be referenced from an '@inlinable' function}} if #available(Grand) { } // expected-error {{availability domain 'Grand' is internal and cannot be referenced from an '@inlinable' function}} if #available(Arctic) { } // expected-error {{availability domain 'Arctic' is internal and cannot be referenced from an '@inlinable' function}} if #available(Baltic) { } if #available(BayBridge) { } if #available(Salt) { } // expected-error {{availability domain 'Salt' cannot be used in an '@inlinable' function because 'Lakes' was imported for SPI only}} if #available(Aral) { } // expected-warning {{availability domain 'Aral' is deprecated}} // expected-warning@-1 {{unnecessary check for 'Aral'; this condition will always be true}} // expected-warning@-2 {{'if' condition is always true}} @available(Colorado) // expected-error {{availability domain 'Colorado' is internal and cannot be referenced from an '@inlinable' function}} @available(Grand) // expected-error {{availability domain 'Grand' is internal and cannot be referenced from an '@inlinable' function}} @available(Arctic) // expected-error {{availability domain 'Arctic' is internal and cannot be referenced from an '@inlinable' function}} @available(Baltic) @available(BayBridge) @available(Salt) // expected-error {{availability domain 'Salt' cannot be used in an '@inlinable' function because 'Lakes' was imported for SPI only}} @available(Aral) // expected-warning {{availability domain 'Aral' is deprecated}} // expected-warning@-1 {{'@available' has no effect because 'Aral' is always available}}{{3-20=}} func nestedFunc() { } } public func nonInlinablePublicFunc() { if #available(Colorado) { } if #available(Grand) { } // expected-warning {{availability domain 'Grand' is deprecated: Use Colorado instead}} if #available(Arctic) { } if #available(Baltic) { } if #available(BayBridge) { } if #available(Salt) { } if #available(Aral) { } // expected-warning {{availability domain 'Aral' is deprecated}} // expected-warning@-1 {{unnecessary check for 'Aral'; this condition will always be true}} // expected-warning@-2 {{'if' condition is always true}} @available(Colorado) @available(Grand) // expected-warning {{availability domain 'Grand' is deprecated: Use Colorado instead}} @available(Arctic) @available(Baltic) @available(BayBridge) @available(Salt) @available(Aral) // expected-warning {{availability domain 'Aral' is deprecated}} // expected-warning@-1 {{'@available' has no effect because 'Aral' is always available}}{{3-20=}} func nestedFunc() { } } @available(Aral) // expected-warning {{availability domain 'Aral' is deprecated}} // expected-warning@-1 {{'@available' has no effect because 'Aral' is always available}}{{1-18=}} func testPermanentlyAvailable() { } @available(Aral, deprecated) // expected-warning@-1 {{'Aral' is always available, use '*' instead}}{{12-16=*}} func testPermanentlyDeprecated() { } @available(Aral, unavailable) // expected-warning {{availability domain 'Aral' is deprecated}} // expected-warning@-1 {{'Aral' is always available, use '*' instead}}{{12-16=*}} func testPermanentlyUnavailable() { } @available(*, deprecated) extension PublicGenericStruct { @available(Aral) // expected-warning@-1 {{'@available' has no effect because 'Aral' is always available}}{{3-19=}} func testPermanentlyAvailableInDeprecatedExtension() { } @available(Aral, deprecated) // expected-warning@-1 {{'Aral' is always available, use '*' instead}}{{14-18=*}} func testPermanentlyDeprecatedInDeprecatedExtension() { } @available(Aral, unavailable) // expected-warning@-1 {{'Aral' is always available, use '*' instead}}{{14-18=*}} func testPermanentlyUnavailableInDeprecatedExtension() { } } @available(*, unavailable) extension PublicGenericStruct { @available(Aral) // expected-warning {{availability domain 'Aral' is deprecated}} // expected-warning@-1 {{'@available' has no effect because 'Aral' is always available}}{{3-20=}} func testPermanentlyAvailableInUnavailableExtension() { } @available(Aral, deprecated) // expected-warning@-1 {{'Aral' is always available, use '*' instead}}{{14-18=*}} func testPermanentlyDeprecatedInUnavailableExtension() { } @available(Aral, unavailable) // expected-warning {{availability domain 'Aral' is deprecated}} // expected-warning@-1 {{'Aral' is always available, use '*' instead}}{{14-18=*}} func testPermanentlyUnavailableInUnavailableExtension() { } } func testUnnecessaryIfAvailableStmt() { if #available(Aral) { // expected-warning@-1 {{availability domain 'Aral' is deprecated}} // expected-warning@-2 {{unnecessary check for 'Aral'; this condition will always be true}}{{none}} // expected-warning@-3 {{'if' condition is always true}}{{none}} } } func testUnnecessaryIfAvailableExpr() { _ = if #available(Aral) { true } else { false } // expected-warning@-1 {{availability domain 'Aral' is deprecated}} // FIXME: [availability] Missing "always true" diagnostic // https://github.com/swiftlang/swift/issues/84453 } func testUnnecessaryIfAvailableCompoundStmt() { if #available(Colorado), #available(Aral) { // expected-warning@-1 {{availability domain 'Aral' is deprecated}} // expected-warning@-2 {{unnecessary check for 'Aral'; this condition will always be true}}{{none}} } } func testUnnecessaryIfUnavailableStmt() { if #unavailable(Aral) { // expected-warning@-1 {{availability domain 'Aral' is deprecated}} // expected-warning@-2 {{unnecessary check for 'Aral'; this condition will always be false}}{{none}} } } func testUnnecessaryIfUnavailableCompoundStmt() { if #unavailable(Colorado), #unavailable(Aral) { // expected-warning@-1 {{availability domain 'Aral' is deprecated}} // expected-warning@-2 {{unnecessary check for 'Aral'; this condition will always be false}}{{none}} } } func testUnnecessaryGuardAvailableStmt() { guard #available(Aral) else { // expected-warning@-1 {{availability domain 'Aral' is deprecated}} // expected-warning@-2 {{unnecessary check for 'Aral'; this condition will always be true}}{{none}} // expected-warning@-3 {{'guard' condition is always true}}{{none}} return } } func testUnnecessaryGuardUnavailableStmt() { guard #unavailable(Aral) else { // expected-warning@-1 {{availability domain 'Aral' is deprecated}} // expected-warning@-2 {{unnecessary check for 'Aral'; this condition will always be false}}{{none}} return } } func testUnnecessaryWhileAvailableStmt() { while #available(Aral) { // expected-warning@-1 {{availability domain 'Aral' is deprecated}} // expected-warning@-2 {{unnecessary check for 'Aral'; this condition will always be true}}{{none}} // expected-warning@-3 {{'while' condition is always true}}{{none}} break } }