Files
swift-mirror/test/attr/attr_abi_objc.swift
Becca Royal-Gordon 01431b87b2 Make @abi non-experimental
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.
2025-05-05 13:50:51 -07:00

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() {}
}