mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
231 lines
10 KiB
Swift
231 lines
10 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() {
|
|
_ = NSAvailableOn10_51() // expected-error {{'NSAvailableOn10_51' is only available on OS X 10.51 or newer}}
|
|
// expected-note@-1 {{add @available attribute to enclosing global function}}
|
|
// expected-note@-2 {{add 'if #available' version check}}
|
|
|
|
|
|
if #available(OSX 10.51, *) {
|
|
let o = NSAvailableOn10_51()
|
|
|
|
// Properties
|
|
_ = o.propertyOn10_52 // expected-error {{'propertyOn10_52' is only available on OS X 10.52 or newer}}
|
|
// expected-note@-1 {{add @available attribute to enclosing global function}}
|
|
// expected-note@-2 {{add 'if #available' version check}}
|
|
|
|
o.propertyOn10_52 = 22 // expected-error {{'propertyOn10_52' is only available on OS X 10.52 or newer}}
|
|
// expected-note@-1 {{add @available attribute to enclosing global function}}
|
|
// expected-note@-2 {{add 'if #available' version check}}
|
|
|
|
// Methods
|
|
o.methodAvailableOn10_52() // expected-error {{'methodAvailableOn10_52()' is only available on OS X 10.52 or newer}}
|
|
// expected-note@-1 {{add @available attribute to enclosing global function}}
|
|
// expected-note@-2 {{add 'if #available' version check}}
|
|
|
|
// Initializers
|
|
|
|
_ = NSAvailableOn10_51(stringOn10_52:"Hi") // expected-error {{'init(stringOn10_52:)' is only available on OS X 10.52 or newer}}
|
|
// expected-note@-1 {{add @available attribute to enclosing global function}}
|
|
// expected-note@-2 {{add 'if #available' version check}}
|
|
}
|
|
}
|
|
|
|
// Declarations with Objective-C-originated potentially unavailable APIs
|
|
|
|
func functionWithObjCParam(o: NSAvailableOn10_51) { // expected-error {{'NSAvailableOn10_51' is only available on OS X 10.51 or newer}}
|
|
// expected-note@-1 {{add @available attribute to enclosing global function}}
|
|
}
|
|
|
|
class ClassExtendingUnvailableClass : NSAvailableOn10_51 { // expected-error {{'NSAvailableOn10_51' is only available on OS X 10.51 or newer}}
|
|
// expected-note@-1 {{add @available attribute to enclosing class}}
|
|
}
|
|
|
|
// We allow classes to conform to potentially unavailable protocols
|
|
class ClassAdoptingUnavailableProtocol : NSProtocolAvailableOn10_51 {
|
|
}
|
|
|
|
class SomeSoonToBeConformingClass { }
|
|
|
|
extension SomeSoonToBeConformingClass : NSProtocolAvailableOn10_51 {
|
|
}
|
|
|
|
// Enums from Objective-C
|
|
|
|
let _: NSPotentiallyUnavailableOptions = .first // expected-error {{'NSPotentiallyUnavailableOptions' is only available on OS X 10.51 or newer}}
|
|
// expected-note@-1 {{add 'if #available' version check}}
|
|
|
|
let _: NSOptionsWithUnavailableElement = .third // expected-error {{'third' is only available on OS X 10.51 or newer}}
|
|
// expected-note@-1 {{add 'if #available' version check}}
|
|
|
|
let _: NSUnavailableEnum = .first // expected-error {{'NSUnavailableEnum' is only available on OS X 10.51 or newer}}
|
|
// expected-note@-1 {{add 'if #available' version check}}
|
|
|
|
let _: NSEnumWithUnavailableElement = .third // expected-error {{'third' is only available on OS X 10.51 or newer}}
|
|
// expected-note@-1 {{add 'if #available' version check}}
|
|
|
|
// Differing availability on getters and setters imported from ObjC.
|
|
|
|
func gettersAndSettersFromObjC(o: NSAvailableOn10_9) {
|
|
let _: Int = o.propertyOn10_51WithSetterOn10_52After // expected-error {{'propertyOn10_51WithSetterOn10_52After' is only available on OS X 10.51 or newer}}
|
|
// expected-note@-1 {{add @available attribute to enclosing global function}}
|
|
// expected-note@-2 {{add 'if #available' version check}}
|
|
|
|
if #available(OSX 10.51, *) {
|
|
// Properties with unavailable accessors declared before property in Objective-C header
|
|
o.propertyOn10_51WithSetterOn10_52Before = 5 // expected-error {{setter for 'propertyOn10_51WithSetterOn10_52Before' is only available on OS X 10.52 or newer}}
|
|
// expected-note@-1 {{add @available attribute to enclosing global function}}
|
|
// expected-note@-2 {{add 'if #available' version check}}
|
|
|
|
let _: Int = o.propertyOn10_51WithGetterOn10_52Before // expected-error {{getter for 'propertyOn10_51WithGetterOn10_52Before' is only available on OS X 10.52 or newer}}
|
|
// expected-note@-1 {{add @available attribute to enclosing global function}}
|
|
// expected-note@-2 {{add 'if #available' version check}}
|
|
|
|
// Properties with unavailable accessors declared after property in Objective-C header
|
|
o.propertyOn10_51WithSetterOn10_52After = 5 // expected-error {{setter for 'propertyOn10_51WithSetterOn10_52After' is only available on OS X 10.52 or newer}}
|
|
// expected-note@-1 {{add @available attribute to enclosing global function}}
|
|
// expected-note@-2 {{add 'if #available' version check}}
|
|
|
|
let _: Int = o.propertyOn10_51WithGetterOn10_52After // expected-error {{getter for 'propertyOn10_51WithGetterOn10_52After' is only available on OS X 10.52 or newer}}
|
|
// expected-note@-1 {{add @available attribute to enclosing global function}}
|
|
// expected-note@-2 {{add 'if #available' 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.52 or newer}}
|
|
// expected-note@-1 {{add @available attribute to enclosing global function}}
|
|
// expected-note@-2 {{add 'if #available' version check}}
|
|
}
|
|
}
|
|
|
|
// Globals from Objective-C
|
|
|
|
func useGlobalsFromObjectiveC() {
|
|
_ = globalStringAvailableOn10_51 // expected-error {{'globalStringAvailableOn10_51' is only available on OS X 10.51 or newer}}
|
|
// expected-note@-1 {{add @available attribute to enclosing global function}}
|
|
// expected-note@-2 {{add 'if #available' version check}}
|
|
|
|
_ = globalStringAvailableOn10_52 // expected-error {{'globalStringAvailableOn10_52' is only available on OS X 10.52 or newer}}
|
|
// expected-note@-1 {{add @available attribute to enclosing global function}}
|
|
// expected-note@-2 {{add 'if #available' version check}}
|
|
|
|
_ = globalClassInstanceAvailableOn10_51 // expected-error {{'globalClassInstanceAvailableOn10_51' is only available on OS X 10.51 or newer}}
|
|
// expected-note@-1 {{add @available attribute to enclosing global function}}
|
|
// expected-note@-2 {{add 'if #available' version check}}
|
|
|
|
if #available(OSX 10.51, *) {
|
|
_ = globalStringAvailableOn10_51
|
|
let _: NSAvailableOn10_51 = globalClassInstanceAvailableOn10_51
|
|
}
|
|
}
|
|
|
|
// 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() { }
|
|
}
|
|
|
|
// Inference of protocol requirement availability when checking conformance to
|
|
// unannotated Objective-C protocols
|
|
class UserClass : UnannotatedFrameworkProtocol {
|
|
|
|
@available(OSX 10.51, *)
|
|
@objc(doSomethingWithClass:)
|
|
func doSomething(with k: AnnotatedFrameworkClass?) { }
|
|
|
|
@available(OSX 10.51, *)
|
|
@objc
|
|
func doSomething(withNonNullableClass k: AnnotatedFrameworkClass) { }
|
|
|
|
@available(OSX 10.51, *)
|
|
@objc(doSomethingWithIUOClass:)
|
|
func doSomething(withIUOClass k: AnnotatedFrameworkClass!) { }
|
|
|
|
@objc
|
|
@available(OSX 10.51, *)
|
|
func returnSomething() -> AnnotatedFrameworkClass? {
|
|
return nil
|
|
}
|
|
|
|
@objc
|
|
func noUnavailableTypesInSignature() { }
|
|
|
|
@objc(doSomethingWithClass:andLaterClass:) @available(OSX 10.52, *)
|
|
func doSomething(with k: AnnotatedFrameworkClass, andLaterClass lk: AnnotatedLaterFrameworkClass) { }
|
|
|
|
@objc
|
|
@available(OSX 10.53, *)
|
|
func someMethodWithAvailability() { }
|
|
|
|
@available(OSX 10.51, *)
|
|
@objc var someProperty: AnnotatedFrameworkClass {
|
|
get { return AnnotatedFrameworkClass() }
|
|
set(newValue) { }
|
|
}
|
|
}
|
|
|
|
func callViaUnannotatedFrameworkProtocol(p: UnannotatedFrameworkProtocol) {
|
|
let _ = p.returnSomething() // expected-error {{'returnSomething()' is only available on OS X 10.51 or newer}}
|
|
// expected-note@-1 {{add @available attribute to enclosing global function}}
|
|
// expected-note@-2 {{add 'if #available' version check}}
|
|
}
|
|
|
|
func callViaAnnotatedFrameworkProtocol(p: AnnotatedFrameworkProtocol) {
|
|
// We won't synthesize availability for AnnotatedFrameworkProtocol because
|
|
// the protocol has an availability annotation on it.
|
|
let _ = p.returnSomething()
|
|
}
|
|
|
|
class SubclassOfFrameworkClassConformingToUnannotatedFrameworkProtocol : FrameworkClassConformingToUnannotatedFrameworkProtocol {
|
|
@available(OSX 10.51, *)
|
|
override func doSomething(withNonNullableClass k: AnnotatedFrameworkClass) {
|
|
}
|
|
|
|
@available(OSX 10.51, *)
|
|
override var someProperty: AnnotatedFrameworkClass {
|
|
get { return AnnotatedFrameworkClass() }
|
|
set(newValue) { }
|
|
}
|
|
|
|
@available(OSX 10.52, *)
|
|
override func doSomething(withIUOClass k: AnnotatedFrameworkClass!) { } // expected-error {{'doSomething' must be as available as declaration it overrides}}
|
|
}
|
|
|
|
@available(OSX 10.52, *)
|
|
class SubclassOfLaterFrameworkClassConformingToUnannotatedFrameworkProtocol : LaterFrameworkClassConformingToUnannotatedFrameworkProtocol {
|
|
@available(OSX 10.52, *)
|
|
override func doSomething(withNonNullableClass k: AnnotatedFrameworkClass) {
|
|
}
|
|
|
|
@available(OSX 10.53, *)
|
|
override func someMethodWithAvailability() { }
|
|
}
|
|
|
|
class SubclassOfFrameworkClassConformingToLaterAnnotatedFrameworkProtocol : FrameworkClassConformingToLaterAnnotatedFrameworkProtocol {
|
|
|
|
@available(OSX 10.52, *)
|
|
override func returnSomething() -> AnnotatedFrameworkClass? {
|
|
}
|
|
|
|
@available(OSX 10.53, *)
|
|
override func someMethodWithAvailability() { }
|
|
|
|
@available(OSX 10.52, *)
|
|
override var someProperty: AnnotatedFrameworkClass {
|
|
get { return AnnotatedFrameworkClass() }
|
|
set(newValue) { }
|
|
}
|
|
}
|