mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
This includes changing the feature name so that compilers with the experimental feature don’t accidentally pick up content that only works in the final version. Resolves rdar://150065196.
156 lines
4.9 KiB
Swift
156 lines
4.9 KiB
Swift
// RUN: %target-typecheck-verify-swift -parse-as-library
|
|
|
|
// REQUIRES: objc_interop
|
|
|
|
import Foundation
|
|
|
|
// @NSCopying -- banned in @abi
|
|
class NSCopyingAttr: NSObject {
|
|
@abi(@NSCopying var v1: NSArray?) // expected-error {{unused 'NSCopying' attribute in '@abi'}} {{8-18=}}
|
|
@NSCopying var v1: NSArray? = nil
|
|
|
|
@abi(var v2: NSArray?)
|
|
@NSCopying var v2: NSArray? = nil
|
|
}
|
|
|
|
// Availability
|
|
// These tests will only work on a versioned platform.
|
|
@available(macOS 99, iOS 99, tvOS 99, watchOS 99, visionOS 99, *)
|
|
struct FutureType {}
|
|
|
|
@abi(func available5(_: FutureType)) // expected-error {{'FutureType' is only available in }}
|
|
func available5(_: FutureType) {} // expected-error {{'FutureType' is only available in }}
|
|
// expected-note@-1 2{{add '@available' attribute to enclosing global function}} (fix-it not tested because it varies by target)
|
|
|
|
@abi(func available6(_: FutureType))
|
|
@available(macOS 99, iOS 99, tvOS 99, watchOS 99, visionOS 99, *) func available6(_: FutureType) {}
|
|
|
|
// @objc -- banned in @abi
|
|
class ObjCAttr: NSObject {
|
|
@abi(@objc func fn1()) // expected-error {{unused 'objc' attribute in '@abi'}} {{8-13=}}
|
|
@objc func fn1() {}
|
|
|
|
@abi(@objc func fn2()) // expected-error {{unused 'objc' attribute in '@abi'}} {{8-13=}}
|
|
func fn2() {}
|
|
|
|
@abi(func fn3())
|
|
@objc func fn3() {}
|
|
}
|
|
|
|
// @IBAction -- banned in @abi
|
|
class IBActionAttr: NSObject {
|
|
@abi(@IBAction func fn1(_: Any)) // expected-error {{unused 'IBAction' attribute in '@abi'}} {{8-17=}}
|
|
@IBAction func fn1(_: Any) {}
|
|
|
|
@abi(@IBAction func fn2(_: Any)) // expected-error {{unused 'IBAction' attribute in '@abi'}} {{8-17=}}
|
|
func fn2(_: Any) {}
|
|
|
|
@abi(func fn3(_: Any))
|
|
@IBAction func fn3(_: Any) {}
|
|
}
|
|
|
|
// @IBInspectable -- banned in @abi
|
|
class IBInspectableAttr: NSObject {
|
|
@abi(@IBInspectable var v1: Double) // expected-error {{unused 'IBInspectable' attribute in '@abi'}} {{8-22=}}
|
|
@IBInspectable var v1: Double = 0.0
|
|
|
|
@abi(@IBInspectable var v2: Double) // expected-error {{unused 'IBInspectable' attribute in '@abi'}} {{8-22=}}
|
|
var v2: Double = 0.0
|
|
|
|
@abi(var v3: Double)
|
|
@IBInspectable var v3: Double = 0.0
|
|
}
|
|
|
|
// @GKInspectable -- banned in @abi
|
|
class GKInspectableAttr: NSObject {
|
|
@abi(@GKInspectable var v1: Double) // expected-error {{unused 'GKInspectable' attribute in '@abi'}} {{8-22=}}
|
|
@GKInspectable var v1: Double = 0.0
|
|
|
|
@abi(@GKInspectable var v2: Double) // expected-error {{unused 'GKInspectable' attribute in '@abi'}} {{8-22=}}
|
|
var v2: Double = 0.0
|
|
|
|
@abi(var v3: Double)
|
|
@GKInspectable var v3: Double = 0.0
|
|
}
|
|
|
|
// @IBOutlet -- banned in @abi
|
|
class IBOutletAttr: NSObject {
|
|
@abi(@IBOutlet var v1: NSObject!) // expected-error {{unused 'IBOutlet' attribute in '@abi'}} {{8-17=}}
|
|
@IBOutlet var v1: NSObject!
|
|
|
|
@abi(@IBOutlet var v2: NSObject!) // expected-error {{unused 'IBOutlet' attribute in '@abi'}} {{8-17=}}
|
|
var v2: NSObject!
|
|
|
|
@abi(var v3: NSObject!)
|
|
@IBOutlet var v3: NSObject!
|
|
}
|
|
|
|
// @IBSegueAction -- banned in @abi
|
|
class IBSegueActionAttr: NSObject {
|
|
@abi(@IBSegueAction func fn1(_: Any) -> Any) // expected-error {{unused 'IBSegueAction' attribute in '@abi'}} {{8-22=}}
|
|
@IBSegueAction func fn1(_: Any) -> Any {}
|
|
|
|
@abi(@IBSegueAction func fn2(_: Any) -> Any) // expected-error {{unused 'IBSegueAction' attribute in '@abi'}} {{8-22=}}
|
|
func fn2(_: Any) -> Any {}
|
|
|
|
@abi(func fn3(_: Any) -> Any)
|
|
@IBSegueAction func fn3(_: Any) -> Any {}
|
|
}
|
|
|
|
// @NSManaged -- banned in @abi
|
|
class NSManagedAttr: NSObject {
|
|
@abi(@NSManaged var v1: NSObject!) // expected-error {{unused 'NSManaged' attribute in '@abi'}} {{8-18=}}
|
|
@NSManaged var v1: NSObject!
|
|
|
|
@abi(@NSManaged var v2: NSObject!) // expected-error {{unused 'NSManaged' attribute in '@abi'}} {{8-18=}}
|
|
var v2: NSObject!
|
|
|
|
@abi(var v3: NSObject!)
|
|
@NSManaged var v3: NSObject!
|
|
}
|
|
|
|
// @nonobjc -- banned in @abi
|
|
@objcMembers
|
|
class NonObjCAttr: NSObject {
|
|
@abi(@nonobjc var v1: NSObject!) // expected-error {{unused 'nonobjc' attribute in '@abi'}} {{8-16=}}
|
|
@nonobjc var v1: NSObject!
|
|
|
|
@abi(@nonobjc var v2: NSObject!) // expected-error {{unused 'nonobjc' attribute in '@abi'}} {{8-16=}}
|
|
var v2: NSObject!
|
|
|
|
@abi(var v3: NSObject!)
|
|
@nonobjc var v3: NSObject!
|
|
}
|
|
|
|
// optional -- banned in @abi
|
|
@objc protocol OptionalModifier {
|
|
@abi(
|
|
@objc // expected-error {{unused 'objc' attribute in '@abi'}} {{5-11=}}
|
|
optional // expected-error {{unused 'optional' modifier in '@abi'}} {{5-14=}}
|
|
func fn1()
|
|
)
|
|
@objc optional func fn1()
|
|
|
|
@abi(
|
|
@objc // expected-error {{unused 'objc' attribute in '@abi'}} {{5-11=}}
|
|
optional // expected-error {{unused 'optional' modifier in '@abi'}} {{5-14=}}
|
|
func fn2()
|
|
)
|
|
@objc func fn2()
|
|
|
|
@abi(func fn3())
|
|
@objc optional func fn3()
|
|
}
|
|
|
|
// dynamic -- banned in @abi
|
|
class DynamicModifier: NSObject {
|
|
@abi(dynamic func fn1()) // expected-error {{unused 'dynamic' modifier in '@abi'}} {{8-15=}}
|
|
dynamic func fn1() {}
|
|
|
|
@abi(dynamic func fn2()) // expected-error {{unused 'dynamic' modifier in '@abi'}} {{8-15=}}
|
|
func fn2() {}
|
|
|
|
@abi(func fn3())
|
|
dynamic func fn3() {}
|
|
}
|