blob: 473bbdd1953f4f16c8ba771427b5bf885d2064bd [file] [log] [blame]
// RUN: %swift -typecheck -verify -parse-stdlib -module-name Swift -target x86_64-apple-macosx10.10 %s
// Fake declarations of some standard library features for -parse-stdlib.
precedencegroup AssignmentPrecedence {}
enum Optional<T> {
case none
case some(T)
}
@available(OSX, introduced: 10.5, deprecated: 10.8, obsoleted: 10.9,
message: "you don't want to do that anyway")
func doSomething() { }
// expected-note @-1{{'doSomething()' was obsoleted in OS X 10.9}}
doSomething() // expected-error{{'doSomething()' is unavailable: you don't want to do that anyway}}
// Preservation of major.minor.micro
@available(OSX, introduced: 10.5, deprecated: 10.8, obsoleted: 10.9.1)
func doSomethingElse() { }
// expected-note @-1{{'doSomethingElse()' was obsoleted in OS X 10.9.1}}
doSomethingElse() // expected-error{{'doSomethingElse()' is unavailable}}
// Preservation of minor-only version
@available(OSX, introduced: 8.0, deprecated: 8.5, obsoleted: 10)
func doSomethingReallyOld() { }
// expected-note @-1{{'doSomethingReallyOld()' was obsoleted in OS X 10}}
doSomethingReallyOld() // expected-error{{'doSomethingReallyOld()' is unavailable}}
// Test deprecations in 10.10 and later
@available(OSX, introduced: 10.5, deprecated: 10.10,
message: "Use another function")
func deprecatedFunctionWithMessage() { }
deprecatedFunctionWithMessage() // expected-warning{{'deprecatedFunctionWithMessage()' was deprecated in OS X 10.10: Use another function}}
@available(OSX, introduced: 10.5, deprecated: 10.10)
func deprecatedFunctionWithoutMessage() { }
deprecatedFunctionWithoutMessage() // expected-warning{{'deprecatedFunctionWithoutMessage()' was deprecated in OS X 10.10}}
@available(OSX, introduced: 10.5, deprecated: 10.10,
message: "Use BetterClass instead")
class DeprecatedClass { }
func functionWithDeprecatedParameter(p: DeprecatedClass) { } // expected-warning{{'DeprecatedClass' was deprecated in OS X 10.10: Use BetterClass instead}}
@available(OSX, introduced: 10.5, deprecated: 10.11,
message: "Use BetterClass instead")
class DeprecatedClassIn10_11 { }
// Elements deprecated later than the minimum deployment target (which is 10.10, in this case) should not generate warnings
func functionWithDeprecatedLaterParameter(p: DeprecatedClassIn10_11) { }
// Unconditional platform unavailability
@available(OSX, unavailable)
func doSomethingNotOnOSX() { }
// expected-note @-1{{'doSomethingNotOnOSX()' has been explicitly marked unavailable here}}
doSomethingNotOnOSX() // expected-error{{'doSomethingNotOnOSX()' is unavailable}}
@available(iOS, unavailable)
func doSomethingNotOniOS() { }
doSomethingNotOniOS() // okay
// Unconditional platform deprecation
@available(OSX, deprecated)
func doSomethingDeprecatedOnOSX() { }
doSomethingDeprecatedOnOSX() // expected-warning{{'doSomethingDeprecatedOnOSX()' is deprecated on OS X}}
@available(iOS, deprecated)
func doSomethingDeprecatedOniOS() { }
doSomethingDeprecatedOniOS() // okay
struct TestStruct {}
@available(macOS 10.10, *)
extension TestStruct { // expected-note {{enclosing scope here}}
@available(swift 400)
func doTheThing() {} // expected-note {{'doTheThing()' was introduced in Swift 400}}
@available(macOS 10.9, *) // expected-error {{declaration cannot be more available than enclosing scope}}
@available(swift 400)
func doAnotherThing() {} // expected-note {{'doAnotherThing()' was introduced in Swift 400}}
@available(macOS 10.12, *)
@available(swift 400)
func doThirdThing() {} // expected-note {{'doThirdThing()' was introduced in Swift 400}}
@available(macOS 10.12, *)
@available(swift 1)
func doFourthThing() {}
@available(*, deprecated)
func doDeprecatedThing() {}
}
@available(macOS 10.11, *)
func testMemberAvailability() {
TestStruct().doTheThing() // expected-error {{'doTheThing()' is unavailable}}
TestStruct().doAnotherThing() // expected-error {{'doAnotherThing()' is unavailable}}
TestStruct().doThirdThing() // expected-error {{'doThirdThing()' is unavailable}}
TestStruct().doFourthThing() // expected-error {{'doFourthThing()' is only available on OS X 10.12 or newer}} expected-note {{'if #available'}}
TestStruct().doDeprecatedThing() // expected-warning {{'doDeprecatedThing()' is deprecated}}
}
extension TestStruct {
struct Data {
mutating func mutate() {}
}
var unavailableGetter: Data {
@available(macOS, unavailable, message: "bad getter")
get { return Data() } // expected-note 2 {{here}}
set {}
}
var unavailableSetter: Data {
get { return Data() }
@available(macOS, obsoleted: 10.5, message: "bad setter")
set {} // expected-note 2 {{setter for 'unavailableSetter' was obsoleted in OS X 10.5}}
}
}
func testAccessors() {
var t = TestStruct()
_ = t.unavailableGetter // expected-error {{getter for 'unavailableGetter' is unavailable}}
t.unavailableGetter = .init()
t.unavailableGetter.mutate() // expected-error {{getter for 'unavailableGetter' is unavailable}}
_ = t.unavailableSetter
t.unavailableSetter = .init() // expected-error {{setter for 'unavailableSetter' is unavailable: bad setter}}
t.unavailableSetter.mutate() // expected-error {{setter for 'unavailableSetter' is unavailable: bad setter}}
}