Skip to content

Commit d08520d

Browse files
committed
Tests: Improve tests for availability checking in unavailable contexts.
Rewrite attr_availability_transitive_osx.swift to be more use a more thorough cartesian product approach to testing possible combinations. Free up Sema/availability.swift to run on platforms besides macOS. NFC.
1 parent e0dd478 commit d08520d

5 files changed

+815
-264
lines changed

test/Sema/availability.swift

Lines changed: 0 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
// RUN: %target-typecheck-verify-swift -parse-as-library -module-name MyModule
22

3-
// REQUIRES: OS=macosx
4-
53
@available(*, unavailable)
64
func unavailable_foo() {} // expected-note {{'unavailable_foo()' has been explicitly marked unavailable here}}
75

@@ -31,90 +29,6 @@ func foo(x : NSUInteger) { // expected-error {{'NSUInteger' is unavailable: use
3129
// expected-error@-1 {{cannot convert value of type 'Int' to specified type 'Outer.NSUInteger'}}
3230
}
3331

34-
/* FIXME 'nil == a' fails to type-check with a bogus error message
35-
* <rdar://problem/17540796>
36-
func markUsed<T>(t: T) {}
37-
func testString() {
38-
let a : String = "Hey"
39-
if a == nil {
40-
markUsed("nil")
41-
} else if nil == a {
42-
markUsed("nil")
43-
}
44-
else {
45-
markUsed("not nil")
46-
}
47-
}
48-
*/
49-
50-
// Test preventing protocol witnesses for unavailable requirements
51-
@objc
52-
protocol ProtocolWithRenamedRequirement {
53-
@available(*, unavailable, renamed: "new(bar:)")
54-
@objc optional func old(foo: Int) // expected-note{{'old(foo:)' has been explicitly marked unavailable here}}
55-
func new(bar: Int)
56-
}
57-
58-
class ClassWithGoodWitness : ProtocolWithRenamedRequirement {
59-
@objc func new(bar: Int) {}
60-
}
61-
62-
class ClassWithBadWitness : ProtocolWithRenamedRequirement {
63-
@objc func old(foo: Int) {} // expected-error{{'old(foo:)' has been renamed to 'new(bar:)'}}
64-
@objc func new(bar: Int) {}
65-
}
66-
67-
@available(OSX, unavailable)
68-
let unavailableOnOSX: Int = 0 // expected-note{{explicitly marked unavailable here}}
69-
@available(iOS, unavailable)
70-
let unavailableOniOS: Int = 0
71-
@available(iOS, unavailable) @available(OSX, unavailable)
72-
let unavailableOnBothA: Int = 0 // expected-note{{explicitly marked unavailable here}}
73-
@available(OSX, unavailable) @available(iOS, unavailable)
74-
let unavailableOnBothB: Int = 0 // expected-note{{explicitly marked unavailable here}}
75-
76-
@available(OSX, unavailable)
77-
typealias UnavailableOnOSX = Int // expected-note{{explicitly marked unavailable here}}
78-
@available(iOS, unavailable)
79-
typealias UnavailableOniOS = Int
80-
@available(iOS, unavailable) @available(OSX, unavailable)
81-
typealias UnavailableOnBothA = Int // expected-note{{explicitly marked unavailable here}}
82-
@available(OSX, unavailable) @available(iOS, unavailable)
83-
typealias UnavailableOnBothB = Int // expected-note{{explicitly marked unavailable here}}
84-
85-
@available(macOS, unavailable)
86-
let unavailableOnMacOS: Int = 0 // expected-note{{explicitly marked unavailable here}}
87-
@available(macOS, unavailable)
88-
typealias UnavailableOnMacOS = Int // expected-note{{explicitly marked unavailable here}}
89-
90-
@available(OSXApplicationExtension, unavailable)
91-
let unavailableOnOSXAppExt: Int = 0
92-
@available(macOSApplicationExtension, unavailable)
93-
let unavailableOnMacOSAppExt: Int = 0
94-
95-
@available(OSXApplicationExtension, unavailable)
96-
typealias UnavailableOnOSXAppExt = Int
97-
@available(macOSApplicationExtension, unavailable)
98-
typealias UnavailableOnMacOSAppExt = Int
99-
100-
func testPlatforms() {
101-
_ = unavailableOnOSX // expected-error{{unavailable}}
102-
_ = unavailableOniOS
103-
_ = unavailableOnBothA // expected-error{{unavailable}}
104-
_ = unavailableOnBothB // expected-error{{unavailable}}
105-
_ = unavailableOnMacOS // expected-error{{unavailable}}
106-
_ = unavailableOnOSXAppExt
107-
_ = unavailableOnMacOSAppExt
108-
109-
let _: UnavailableOnOSX = 0 // expected-error{{unavailable}}
110-
let _: UnavailableOniOS = 0
111-
let _: UnavailableOnBothA = 0 // expected-error{{unavailable}}
112-
let _: UnavailableOnBothB = 0 // expected-error{{unavailable}}
113-
let _: UnavailableOnMacOS = 0 // expected-error{{unavailable}}
114-
let _: UnavailableOnOSXAppExt = 0
115-
let _: UnavailableOnMacOSAppExt = 0
116-
}
117-
11832
struct VarToFunc {
11933
@available(*, unavailable, renamed: "function()")
12034
var variable: Int { // expected-note 2 {{explicitly marked unavailable here}}

test/attr/attr_availability_objc.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,3 +142,20 @@ class Kitten : Snout {}
142142
extension Kitten {
143143
@nonobjc func sniff() {}
144144
}
145+
146+
// Test preventing protocol witnesses for unavailable requirements
147+
@objc
148+
protocol ProtocolWithRenamedRequirement {
149+
@available(*, unavailable, renamed: "new(bar:)")
150+
@objc optional func old(foo: Int) // expected-note{{'old(foo:)' has been explicitly marked unavailable here}}
151+
func new(bar: Int)
152+
}
153+
154+
class ClassWithGoodWitness : ProtocolWithRenamedRequirement {
155+
@objc func new(bar: Int) {}
156+
}
157+
158+
class ClassWithBadWitness : ProtocolWithRenamedRequirement {
159+
@objc func old(foo: Int) {} // expected-error{{'old(foo:)' has been renamed to 'new(bar:)'}}
160+
@objc func new(bar: Int) {}
161+
}

test/attr/attr_availability_transitive_multiple.swift

Lines changed: 0 additions & 18 deletions
This file was deleted.

0 commit comments

Comments
 (0)