Skip to content

Commit ec792c4

Browse files
committed
Tests: Add regression tests for transitive Swift language mode availability.
1 parent 84532e8 commit ec792c4

File tree

1 file changed

+315
-0
lines changed

1 file changed

+315
-0
lines changed
Lines changed: 315 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,315 @@
1+
// RUN: %target-typecheck-verify-swift -parse-as-library
2+
3+
// Allow referencing unavailable API in situations where the caller is marked unavailable in the same circumstances.
4+
5+
struct AlwaysAvailable {}
6+
7+
@available(*, unavailable)
8+
struct NeverAvailable {} // expected-note * {{'NeverAvailable' has been explicitly marked unavailable here}}
9+
10+
@available(swift, obsoleted: 4)
11+
struct UnavailableInSwift4 {} // expected-note * {{'UnavailableInSwift4' was obsoleted in Swift 4}}
12+
13+
@available(swift, introduced: 99)
14+
struct AvailableInFutureSwift {} // expected-note * {{'AvailableInFutureSwift' was introduced in Swift 99}}
15+
16+
@discardableResult
17+
func always() -> AlwaysAvailable {
18+
AlwaysAvailable()
19+
}
20+
21+
@available(*, unavailable)
22+
@discardableResult
23+
func never() -> NeverAvailable { // expected-note * {{'never()' has been explicitly marked unavailable here}}
24+
NeverAvailable()
25+
}
26+
27+
@available(swift, obsoleted: 4)
28+
@discardableResult
29+
func unavailableInSwift4() -> UnavailableInSwift4 { // expected-note * {{'unavailableInSwift4()' was obsoleted in Swift 4}}
30+
UnavailableInSwift4() // expected-error {{'UnavailableInSwift4' is unavailable}}
31+
}
32+
33+
@available(swift, introduced: 99)
34+
@discardableResult
35+
func availableInFutureSwift() -> AvailableInFutureSwift { // expected-note * {{'availableInFutureSwift()' was introduced in Swift 99}}
36+
AvailableInFutureSwift() // expected-error {{'AvailableInFutureSwift' is unavailable}}
37+
}
38+
39+
// MARK: Global functions
40+
41+
func available_func( // expected-note * {{add @available attribute to enclosing global function}}
42+
_: AlwaysAvailable,
43+
_: NeverAvailable, // expected-error {{'NeverAvailable' is unavailable}}
44+
_: UnavailableInSwift4, // expected-error {{'UnavailableInSwift4' is unavailable}}
45+
_: AvailableInFutureSwift, // expected-error {{'AvailableInFutureSwift' is unavailable}}
46+
) {
47+
always()
48+
never() // expected-error {{'never()' is unavailable}}
49+
unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
50+
availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable}}
51+
}
52+
53+
@available(*, unavailable)
54+
func never_available_func(
55+
_: AlwaysAvailable,
56+
_: NeverAvailable,
57+
_: UnavailableInSwift4,
58+
_: AvailableInFutureSwift,
59+
) {
60+
always()
61+
never() // expected-error {{'never()' is unavailable}}
62+
unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
63+
availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable}}
64+
}
65+
66+
@available(swift, obsoleted: 4)
67+
func unavailable_in_swift4_func(
68+
_: AlwaysAvailable,
69+
_: NeverAvailable,
70+
_: UnavailableInSwift4,
71+
_: AvailableInFutureSwift,
72+
) {
73+
always()
74+
never() // expected-error {{'never()' is unavailable}}
75+
unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
76+
availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable}}
77+
}
78+
79+
@available(swift, introduced: 99)
80+
func introduced_in_future_swift_func(
81+
_: AlwaysAvailable,
82+
_: NeverAvailable,
83+
_: UnavailableInSwift4,
84+
_: AvailableInFutureSwift,
85+
) {
86+
always()
87+
never() // expected-error {{'never()' is unavailable}}
88+
unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
89+
availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable}}
90+
}
91+
92+
// MARK: Global vars
93+
94+
var always_var: (
95+
AlwaysAvailable,
96+
NeverAvailable, // expected-error {{'NeverAvailable' is unavailable}}
97+
UnavailableInSwift4, // expected-error {{'UnavailableInSwift4' is unavailable}}
98+
AvailableInFutureSwift // expected-error {{'AvailableInFutureSwift' is unavailable}}
99+
) = (
100+
always(),
101+
never(), // expected-error {{'never()' is unavailable}}
102+
unavailableInSwift4(), // expected-error {{'unavailableInSwift4()' is unavailable}}
103+
availableInFutureSwift(), // expected-error {{'availableInFutureSwift()' is unavailable}}
104+
)
105+
106+
@available(*, unavailable)
107+
var never_var: (
108+
AlwaysAvailable,
109+
NeverAvailable,
110+
UnavailableInSwift4,
111+
AvailableInFutureSwift
112+
) = (
113+
always(),
114+
never(), // expected-error {{'never()' is unavailable}}
115+
unavailableInSwift4(), // expected-error {{'unavailableInSwift4()' is unavailable}}
116+
availableInFutureSwift(), // expected-error {{'availableInFutureSwift()' is unavailable}}
117+
)
118+
119+
@available(swift, obsoleted: 4)
120+
var unavailable_in_swift4_var: (
121+
AlwaysAvailable,
122+
NeverAvailable,
123+
UnavailableInSwift4,
124+
AvailableInFutureSwift
125+
) = (
126+
always(),
127+
never(), // expected-error {{'never()' is unavailable}}
128+
unavailableInSwift4(), // expected-error {{'unavailableInSwift4()' is unavailable}}
129+
availableInFutureSwift(), // expected-error {{'availableInFutureSwift()' is unavailable}}
130+
)
131+
132+
@available(swift, introduced: 99)
133+
var available_in_future_swift_var: (
134+
AlwaysAvailable,
135+
NeverAvailable,
136+
UnavailableInSwift4,
137+
AvailableInFutureSwift
138+
) = (
139+
always(),
140+
never(), // expected-error {{'never()' is unavailable}}
141+
unavailableInSwift4(), // expected-error {{'unavailableInSwift4()' is unavailable}}
142+
availableInFutureSwift(), // expected-error {{'availableInFutureSwift()' is unavailable}}
143+
)
144+
145+
146+
// MARK: Properties
147+
148+
struct AlwaysAvailableContainer {
149+
let always_var: AlwaysAvailable = always()
150+
let never_var: NeverAvailable = never() // expected-error {{'never()' is unavailable}}
151+
// expected-error@-1 {{'NeverAvailable' is unavailable}}
152+
let unavailable_in_swift4_var: UnavailableInSwift4 = unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
153+
// expected-error@-1 {{'UnavailableInSwift4' is unavailable}}
154+
let available_in_future_swift_var: AvailableInFutureSwift = availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable}}
155+
// expected-error@-1 {{'AvailableInFutureSwift' is unavailable}}
156+
}
157+
158+
@available(*, unavailable)
159+
struct NeverAvailableContainer { // expected-note {{'NeverAvailableContainer' has been explicitly marked unavailable here}}
160+
let always_var: AlwaysAvailable = always()
161+
let never_var: NeverAvailable = never() // expected-error {{'never()' is unavailable}}
162+
let unavailable_in_swift4_var: UnavailableInSwift4 = unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
163+
let available_in_future_swift_var: AvailableInFutureSwift = availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable}}
164+
}
165+
166+
@available(swift, obsoleted: 4)
167+
struct UnavailableInSwift4Container { // expected-note {{'UnavailableInSwift4Container' was obsoleted in Swift 4}}
168+
let always_var: AlwaysAvailable = always()
169+
let never_var: NeverAvailable = never() // expected-error {{'never()' is unavailable}}
170+
let unavailable_in_swift4_var: UnavailableInSwift4 = unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
171+
let available_in_future_swift_var: AvailableInFutureSwift = availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable}}
172+
}
173+
174+
@available(swift, introduced: 99)
175+
struct AvailableInFutureSwiftContainer { // expected-note {{'AvailableInFutureSwiftContainer' was introduced in Swift 99}}
176+
let always_var: AlwaysAvailable = always()
177+
let never_var: NeverAvailable = never() // expected-error {{'never()' is unavailable}}
178+
let unavailable_in_swift4_var: UnavailableInSwift4 = unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
179+
let available_in_future_swift_var: AvailableInFutureSwift = availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable}}
180+
}
181+
182+
// MARK: Extensions
183+
184+
extension AlwaysAvailableContainer {}
185+
extension NeverAvailableContainer {} // expected-error {{'NeverAvailableContainer' is unavailable}}
186+
extension UnavailableInSwift4Container {} // expected-error {{'UnavailableInSwift4Container' is unavailable}}
187+
extension AvailableInFutureSwiftContainer {} // expected-error {{'AvailableInFutureSwiftContainer' is unavailable}}
188+
189+
@available(*, unavailable)
190+
extension AlwaysAvailableContainer {}
191+
@available(*, unavailable)
192+
extension NeverAvailableContainer {}
193+
@available(*, unavailable)
194+
extension UnavailableInSwift4Container {}
195+
@available(*, unavailable)
196+
extension AvailableInFutureSwiftContainer {}
197+
198+
@available(swift, obsoleted: 4)
199+
extension AlwaysAvailableContainer {}
200+
@available(swift, obsoleted: 4)
201+
extension NeverAvailableContainer {}
202+
@available(swift, obsoleted: 4)
203+
extension UnavailableInSwift4Container {}
204+
@available(swift, obsoleted: 4)
205+
extension AvailableInFutureSwiftContainer {}
206+
207+
@available(swift, introduced: 99)
208+
extension AlwaysAvailableContainer {}
209+
@available(swift, introduced: 99)
210+
extension NeverAvailableContainer {}
211+
@available(swift, introduced: 99)
212+
extension UnavailableInSwift4Container {}
213+
@available(swift, introduced: 99)
214+
extension AvailableInFutureSwiftContainer {}
215+
216+
struct ExtendMe {}
217+
218+
@available(*, unavailable)
219+
extension ExtendMe {
220+
func never_available_extension_available_method() {} // expected-note {{has been explicitly marked unavailable here}}
221+
222+
func never_available_extension_available_method( // expected-note * {{add @available attribute to enclosing instance method}}
223+
_: AlwaysAvailable,
224+
_: NeverAvailable,
225+
_: UnavailableInSwift4,
226+
_: AvailableInFutureSwift,
227+
) {
228+
always()
229+
never() // expected-error {{'never()' is unavailable}}
230+
unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
231+
availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable}}
232+
}
233+
234+
@available(*, unavailable)
235+
func never_available_extension_never_available_method(
236+
_: AlwaysAvailable,
237+
_: NeverAvailable,
238+
_: UnavailableInSwift4,
239+
_: AvailableInFutureSwift,
240+
) {
241+
always()
242+
never() // expected-error {{'never()' is unavailable}}
243+
unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
244+
availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable}}
245+
}
246+
247+
@available(swift, obsoleted: 4)
248+
func never_available_extension_unavailable_in_swift4_method(
249+
_: AlwaysAvailable,
250+
_: NeverAvailable,
251+
_: UnavailableInSwift4,
252+
_: AvailableInFutureSwift,
253+
) {
254+
always()
255+
never() // expected-error {{'never()' is unavailable}}
256+
unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
257+
availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable}}
258+
}
259+
260+
@available(swift, introduced: 99)
261+
func never_available_extension_available_in_future_swift_method(
262+
_: AlwaysAvailable,
263+
_: NeverAvailable,
264+
_: UnavailableInSwift4,
265+
_: AvailableInFutureSwift,
266+
) {
267+
always()
268+
never() // expected-error {{'never()' is unavailable}}
269+
unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
270+
availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable}}
271+
}
272+
273+
}
274+
275+
@available(swift, obsoleted: 4)
276+
extension ExtendMe {
277+
func unavailable_in_swift4_extension_available_method() {} // expected-note {{'unavailable_in_swift4_extension_available_method()' was obsoleted in Swift 4}}
278+
279+
@available(*, unavailable)
280+
func unavailable_in_swift4_extension_never_available_method(
281+
_: AlwaysAvailable,
282+
_: NeverAvailable,
283+
_: UnavailableInSwift4,
284+
_: AvailableInFutureSwift,
285+
) {
286+
always()
287+
never() // expected-error {{'never()' is unavailable}}
288+
unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
289+
availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable}}
290+
}
291+
}
292+
293+
@available(swift, introduced: 99)
294+
extension ExtendMe {
295+
func available_in_future_swift_extension_available_method() {} // expected-note {{'available_in_future_swift_extension_available_method()' was introduced in Swift 99}}
296+
297+
@available(*, unavailable)
298+
func available_in_future_swift_extension_never_available_method(
299+
_: AlwaysAvailable,
300+
_: NeverAvailable,
301+
_: UnavailableInSwift4,
302+
_: AvailableInFutureSwift,
303+
) {
304+
always()
305+
never() // expected-error {{'never()' is unavailable}}
306+
unavailableInSwift4() // expected-error {{'unavailableInSwift4()' is unavailable}}
307+
availableInFutureSwift() // expected-error {{'availableInFutureSwift()' is unavailable}}
308+
}
309+
}
310+
311+
func available_func_call_extension_methods(_ e: ExtendMe) {
312+
e.never_available_extension_available_method() // expected-error {{'never_available_extension_available_method()' is unavailable}}
313+
e.unavailable_in_swift4_extension_available_method() // expected-error {{'unavailable_in_swift4_extension_available_method()' is unavailable}}
314+
e.available_in_future_swift_extension_available_method() // expected-error {{'available_in_future_swift_extension_available_method()' is unavailable}}
315+
}

0 commit comments

Comments
 (0)