Files
swift-mirror/test/Sema/availability_versions_objc_api.swift
Devin Coughlin 37088d4fb9 Parse: Update parsing of #available(...) to no longer user >= version comparison
Change the syntax of availability queries from #available(iOS >= 8.0, OSX >= 10.10, *) to

This change reflects the fact that now that we spell the query '#available()' rather than
'#os()', the specification is about availability of the APIs introduced in a particular OS
release rather than an explicit range of OS versions on which the developer expects the
code to run.

There is a Fix-It to remove '>=' to ease adopting the new syntax.

Swift SVN r28025
2015-05-01 05:34:10 +00:00

134 lines
7.1 KiB
Swift

// RUN: %target-parse-verify-swift %clang-importer-sdk -I %S/Inputs/custom-modules
// RUN: not %target-swift-frontend -parse %clang-importer-sdk -I %S/Inputs/custom-modules %s 2>&1 | FileCheck %s
// REQUIRES: OS=macosx
// REQUIRES: objc_interop
import Foundation
// Tests for uses of version-based potential unavailability imported from ObjC APIs.
func callUnavailableObjC() {
let _ = NSAvailableOn10_10() // expected-error {{'NSAvailableOn10_10' is only available on OS X 10.10 or newer}}
// expected-note@-1 {{add @availability attribute to enclosing global function}}
// expected-note@-2 {{guard with version check}}
if #available(OSX 10.10, *) {
let o = NSAvailableOn10_10()
// Properties
let _ = o.propertyOn10_11 // expected-error {{'propertyOn10_11' is only available on OS X 10.11 or newer}}
// expected-note@-1 {{add @availability attribute to enclosing global function}}
// expected-note@-2 {{guard with version check}}
o.propertyOn10_11 = 22 // expected-error {{'propertyOn10_11' is only available on OS X 10.11 or newer}}
// expected-note@-1 {{add @availability attribute to enclosing global function}}
// expected-note@-2 {{guard with version check}}
// Methods
o.methodAvailableOn10_11() // expected-error {{'methodAvailableOn10_11()' is only available on OS X 10.11 or newer}}
// expected-note@-1 {{add @availability attribute to enclosing global function}}
// expected-note@-2 {{guard with version check}}
// Initializers
let _ = NSAvailableOn10_10(stringOn10_11:"Hi") // expected-error {{'init(stringOn10_11:)' is only available on OS X 10.11 or newer}}
// expected-note@-1 {{add @availability attribute to enclosing global function}}
// expected-note@-2 {{guard with version check}}
}
}
// Declarations with Objective-C-originated potentially unavailable APIs
func functionWithObjCParam(o: NSAvailableOn10_10) { // expected-error {{'NSAvailableOn10_10' is only available on OS X 10.10 or newer}}
// expected-note@-1 {{add @availability attribute to enclosing global function}}
}
class ClassExtendingUnvailableClass : NSAvailableOn10_10 { // expected-error {{'NSAvailableOn10_10' is only available on OS X 10.10 or newer}}
// expected-note@-1 {{add @availability attribute to enclosing class}}
}
class ClassAdoptingUnavailableProtocol : NSProtocolAvailableOn10_10 { // expected-error {{'NSProtocolAvailableOn10_10' is only available on OS X 10.10 or newer}}
// expected-note@-1 {{add @availability attribute to enclosing class}}
}
// Enums from Objective-C
let _: NSPotentiallyUnavailableOptions = .First // expected-error {{'NSPotentiallyUnavailableOptions' is only available on OS X 10.10 or newer}}
// expected-note@-1 {{guard with version check}}
let _: NSOptionsWithUnavailableElement = .Third // expected-error {{'Third' is only available on OS X 10.10 or newer}}
// expected-note@-1 {{guard with version check}}
let _: NSUnavailableEnum = .First // expected-error {{'NSUnavailableEnum' is only available on OS X 10.10 or newer}}
// expected-note@-1 {{guard with version check}}
let _: NSEnumWithUnavailableElement = .Third // expected-error {{'Third' is only available on OS X 10.10 or newer}}
// expected-note@-1 {{guard with version check}}
// Differing availability on getters and setters imported from ObjC.
func gettersAndSettersFromObjC(o: NSAvailableOn10_9) {
let _: Int = o.propertyOn10_10WithSetterOn10_11After // expected-error {{'propertyOn10_10WithSetterOn10_11After' is only available on OS X 10.10 or newer}}
// expected-note@-1 {{add @availability attribute to enclosing global function}}
// expected-note@-2 {{guard with version check}}
if #available(OSX 10.10, *) {
// Properties with unavailable accessors declared before property in Objective-C header
o.propertyOn10_10WithSetterOn10_11Before = 5 // expected-error {{setter for 'propertyOn10_10WithSetterOn10_11Before' is only available on OS X 10.11 or newer}}
// expected-note@-1 {{add @availability attribute to enclosing global function}}
// expected-note@-2 {{guard with version check}}
let _: Int = o.propertyOn10_10WithGetterOn10_11Before // expected-error {{getter for 'propertyOn10_10WithGetterOn10_11Before' is only available on OS X 10.11 or newer}}
// expected-note@-1 {{add @availability attribute to enclosing global function}}
// expected-note@-2 {{guard with version check}}
// Properties with unavailable accessors declared after property in Objective-C header
o.propertyOn10_10WithSetterOn10_11After = 5 // expected-error {{setter for 'propertyOn10_10WithSetterOn10_11After' is only available on OS X 10.11 or newer}}
// expected-note@-1 {{add @availability attribute to enclosing global function}}
// expected-note@-2 {{guard with version check}}
let _: Int = o.propertyOn10_10WithGetterOn10_11After // expected-error {{getter for 'propertyOn10_10WithGetterOn10_11After' is only available on OS X 10.11 or newer}}
// expected-note@-1 {{add @availability attribute to enclosing global function}}
// expected-note@-2 {{guard with version check}}
// Property with unavailable setter redeclared in Objective-C category
o.readOnlyRedeclaredWithSetterInCategory = 5 // expected-error {{setter for 'readOnlyRedeclaredWithSetterInCategory' is only available on OS X 10.11 or newer}}
// expected-note@-1 {{add @availability attribute to enclosing global function}}
// expected-note@-2 {{guard with version check}}
}
}
// Globals from Objective-C
func useGlobalsFromObjectiveC() {
let _ = globalStringAvailableOn10_10 // expected-error {{'globalStringAvailableOn10_10' is only available on OS X 10.10 or newer}}
// expected-note@-1 {{add @availability attribute to enclosing global function}}
// expected-note@-2 {{guard with version check}}
let _ = globalStringAvailableOn10_11 // expected-error {{'globalStringAvailableOn10_11' is only available on OS X 10.11 or newer}}
// expected-note@-1 {{add @availability attribute to enclosing global function}}
// expected-note@-2 {{guard with version check}}
let _ = globalClassInstanceAvailableOn10_10 // expected-error {{'globalClassInstanceAvailableOn10_10' is only available on OS X 10.10 or newer}}
// expected-note@-1 {{add @availability attribute to enclosing global function}}
// expected-note@-2 {{guard with version check}}
if #available(OSX 10.10, *) {
let _ = globalStringAvailableOn10_10
let _: NSAvailableOn10_10 = globalClassInstanceAvailableOn10_10
}
}
// Optional Protocol Requirements from Objective-C
// Make sure we're not emitting errors in the Foundation module, where the witness is.
// CHECK-NOT: Foundation.NSClassWithMethodFromNSProtocolWithOptionalRequirement:
class SubclassOfNSClassWithMethodFromNSProtocolWithOptionalRequirement : NSClassWithMethodFromNSProtocolWithOptionalRequirement {
}
class SubclassWithItsOwnAvailableWitnessOfNSClassWithMethodFromNSProtocolWithOptionalRequirement : NSClassWithMethodFromNSProtocolWithOptionalRequirement {
override func optionalRequirement() { }
}