File: attr_availability_transitive_osx_appext.swift

package info (click to toggle)
swiftlang 6.1.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,791,532 kB
  • sloc: cpp: 9,901,743; ansic: 2,201,431; asm: 1,091,827; python: 308,252; objc: 82,166; f90: 80,126; lisp: 38,358; pascal: 25,559; sh: 20,429; ml: 5,058; perl: 4,745; makefile: 4,484; awk: 3,535; javascript: 3,018; xml: 918; fortran: 664; cs: 573; ruby: 396
file content (362 lines) | stat: -rw-r--r-- 12,686 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
// RUN: %target-typecheck-verify-swift -parse-as-library -application-extension
// REQUIRES: OS=macosx

// Allow referencing unavailable API in situations where the caller is marked unavailable in the same circumstances.

@available(*, unavailable)
struct NeverAvailable {} // expected-note * {{'NeverAvailable' has been explicitly marked unavailable here}}

@available(OSX, unavailable)
struct OSXUnavailable {} // expected-note * {{'OSXUnavailable' has been explicitly marked unavailable here}}

@available(OSXApplicationExtension, unavailable)
struct OSXAppExtensionsUnavailable {} // expected-note * {{'OSXAppExtensionsUnavailable' has been explicitly marked unavailable here}}

@available(*, unavailable)
@discardableResult
func never() -> NeverAvailable { // expected-note * {{'never()' has been explicitly marked unavailable here}}
  NeverAvailable()
}

@available(OSX, unavailable)
@discardableResult
func osx() -> OSXUnavailable { // expected-note * {{'osx()' has been explicitly marked unavailable here}}
  OSXUnavailable()
}

@available(OSXApplicationExtension, unavailable)
@discardableResult
func osx_extension() -> OSXAppExtensionsUnavailable { // expected-note * {{'osx_extension()' has been explicitly marked unavailable here}}
  OSXAppExtensionsUnavailable()
}

// MARK: Global functions

func available_func(
  _: NeverAvailable, // expected-error {{'NeverAvailable' is unavailable}}
  _: OSXUnavailable, // expected-error {{'OSXUnavailable' is unavailable in macOS}}
  _: OSXAppExtensionsUnavailable // expected-error {{'OSXAppExtensionsUnavailable' is unavailable in application extensions for macOS}}
) {
  never() // expected-error {{'never()' is unavailable}}
  osx() // expected-error {{'osx()' is unavailable}}
  osx_extension() // expected-error {{'osx_extension()' is unavailable in application extensions for macOS}}
}

@available(*, unavailable)
func never_available_func(
  _: NeverAvailable,
  _: OSXUnavailable,
  _: OSXAppExtensionsUnavailable
) {
  never() // expected-error {{'never()' is unavailable}}
  osx()
  osx_extension()
}

@available(OSX, unavailable)
func osx_func(
  _: NeverAvailable,
  _: OSXUnavailable,
  _: OSXAppExtensionsUnavailable
) {
  never() // expected-error {{'never()' is unavailable}}
  osx()
  osx_extension()
}

@available(OSXApplicationExtension, unavailable)
func osx_extension_func(
  _: NeverAvailable,
  _: OSXUnavailable,
  _: OSXAppExtensionsUnavailable
) {
  never() // expected-error {{'never()' is unavailable}}
  osx() // expected-error {{'osx()' is unavailable}}
  osx_extension()
}

// MARK: Global vars

var always_var: (
  NeverAvailable, // expected-error {{'NeverAvailable' is unavailable}}
  OSXUnavailable, // expected-error {{'OSXUnavailable' is unavailable in macOS}}
  OSXAppExtensionsUnavailable // expected-error {{'OSXAppExtensionsUnavailable' is unavailable in application extensions for macOS}}
) = (
  never(), // expected-error {{'never()' is unavailable}}
  osx(), // expected-error {{'osx()' is unavailable}}
  osx_extension() // expected-error {{'osx_extension()' is unavailable in application extensions for macOS}}
)

@available(*, unavailable)
var never_var: (
  NeverAvailable,
  OSXUnavailable,
  OSXAppExtensionsUnavailable
) = (
  never(), // expected-error {{'never()' is unavailable}}
  osx(),
  osx_extension()
)

@available(OSX, unavailable)
var osx_var: (
  NeverAvailable,
  OSXUnavailable,
  OSXAppExtensionsUnavailable
) = (
  never(), // expected-error {{'never()' is unavailable}}
  osx(),
  osx_extension()
)

@available(OSXApplicationExtension, unavailable)
var osx_extension_var: (
  NeverAvailable,
  OSXUnavailable,
  OSXAppExtensionsUnavailable
) = (
  never(), // expected-error {{'never()' is unavailable}}
  osx(), // expected-error {{'osx()' is unavailable}}
  osx_extension()
)

// MARK: Properties

struct AlwaysAvailabileContainer {
  let never_var: NeverAvailable = never() // expected-error {{'never()' is unavailable}}
  // expected-error@-1 {{'NeverAvailable' is unavailable}}
  let osx_var: OSXUnavailable = osx() // expected-error {{'osx()' is unavailable}}
  // expected-error@-1 {{'OSXUnavailable' is unavailable in macOS}}
  let osx_extension_var: OSXAppExtensionsUnavailable = osx_extension() // expected-error {{'osx_extension()' is unavailable in application extensions for macOS}}
  // expected-error@-1 {{'OSXAppExtensionsUnavailable' is unavailable in application extensions for macOS}}
}

@available(*, unavailable)
struct NeverAvailableContainer { // expected-note {{'NeverAvailableContainer' has been explicitly marked unavailable here}}
  let never_var: NeverAvailable = never() // expected-error {{'never()' is unavailable}}
  let osx_var: OSXUnavailable = osx()
  let osx_extension_var: OSXAppExtensionsUnavailable = osx_extension()
}

@available(OSX, unavailable)
struct OSXUnavailableContainer { // expected-note {{'OSXUnavailableContainer' has been explicitly marked unavailable here}}
  let never_var: NeverAvailable = never() // expected-error {{'never()' is unavailable}}
  let osx_var: OSXUnavailable = osx()
  let osx_extension_var: OSXAppExtensionsUnavailable = osx_extension()
}

@available(OSXApplicationExtension, unavailable)
struct OSXAppExtensionsUnavailableContainer { // expected-note {{'OSXAppExtensionsUnavailableContainer' has been explicitly marked unavailable here}}
  let never_var: NeverAvailable = never() // expected-error {{'never()' is unavailable}}
  let osx_var: OSXUnavailable = osx() // expected-error {{'osx()' is unavailable}}
  let osx_extension_var: OSXAppExtensionsUnavailable = osx_extension()
}

// MARK: Extensions

extension AlwaysAvailabileContainer {}
extension NeverAvailableContainer {} // expected-error {{'NeverAvailableContainer' is unavailable}}
extension OSXUnavailableContainer {} // expected-error {{'OSXUnavailableContainer' is unavailable in macOS}}
extension OSXAppExtensionsUnavailableContainer {} // expected-error {{'OSXAppExtensionsUnavailableContainer' is unavailable in application extensions for macOS}}

@available(*, unavailable)
extension AlwaysAvailabileContainer {}
@available(*, unavailable)
extension NeverAvailableContainer {}
@available(*, unavailable)
extension OSXUnavailableContainer {}
@available(*, unavailable)
extension OSXAppExtensionsUnavailableContainer {}

@available(OSX, unavailable)
extension AlwaysAvailabileContainer {}
@available(OSX, unavailable)
extension NeverAvailableContainer {}
@available(OSX, unavailable)
extension OSXUnavailableContainer {}
@available(OSX, unavailable)
extension OSXAppExtensionsUnavailableContainer {}

@available(OSXApplicationExtension, unavailable)
extension AlwaysAvailabileContainer {}
@available(OSXApplicationExtension, unavailable)
extension NeverAvailableContainer {}
@available(OSXApplicationExtension, unavailable)
extension OSXUnavailableContainer {}
@available(OSXApplicationExtension, unavailable)
extension OSXAppExtensionsUnavailableContainer {}

struct ExtendMe {}

@available(*, unavailable)
extension ExtendMe {
  func never_available_extension_available_method() {} // expected-note {{has been explicitly marked unavailable here}}

  @available(OSX 99, *)
  func never_available_extension_osx_future_method() {} // expected-note {{has been explicitly marked unavailable here}}

  func never_available_extension_available_method(
    _: NeverAvailable,
    _: OSXUnavailable,
    _: OSXAppExtensionsUnavailable
  ) {
    never() // expected-error {{'never()' is unavailable}}
    osx()
    osx_extension()
  }

  @available(*, unavailable)
  func never_available_extension_never_available_method(
    _: NeverAvailable,
    _: OSXUnavailable,
    _: OSXAppExtensionsUnavailable
  ) {
    never() // expected-error {{'never()' is unavailable}}
    osx()
    osx_extension()
  }

  @available(OSX, unavailable)
  func never_available_extension_osx_method(
    _: NeverAvailable,
    _: OSXUnavailable,
    _: OSXAppExtensionsUnavailable
  ) {
    never() // expected-error {{'never()' is unavailable}}
    osx()
    osx_extension()
  }

  @available(OSXApplicationExtension, unavailable)
  func never_available_extension_osx_app_extension_method(
    _: NeverAvailable,
    _: OSXUnavailable,
    _: OSXAppExtensionsUnavailable
  ) {
    never() // expected-error {{'never()' is unavailable}}
    osx()
    osx_extension()
  }
}

@available(OSX, unavailable)
extension ExtendMe {
  func osx_extension_available_method() {} // expected-note {{has been explicitly marked unavailable here}}

  @available(OSX 99, *)
  func osx_extension_osx_future_method() {} // expected-note {{has been explicitly marked unavailable here}}

  func osx_extension_available_method(
    _: NeverAvailable,
    _: OSXUnavailable,
    _: OSXAppExtensionsUnavailable
  ) {
    never() // expected-error {{'never()' is unavailable}}
    osx()
    osx_extension()
  }

  @available(*, unavailable)
  func osx_extension_never_available_method(
    _: NeverAvailable,
    _: OSXUnavailable,
    _: OSXAppExtensionsUnavailable
  ) {
    never() // expected-error {{'never()' is unavailable}}
    osx()
    osx_extension()
  }

  @available(OSX, unavailable)
  func osx_extension_osx_method(
    _: NeverAvailable,
    _: OSXUnavailable,
    _: OSXAppExtensionsUnavailable
  ) {
    never() // expected-error {{'never()' is unavailable}}
    osx()
    osx_extension()
  }

  @available(OSXApplicationExtension, unavailable)
  func osx_extension_osx_app_extension_method(
    _: NeverAvailable,
    _: OSXUnavailable,
    _: OSXAppExtensionsUnavailable
  ) {
    never() // expected-error {{'never()' is unavailable}}
    osx()
    osx_extension()
  }
}

@available(OSXApplicationExtension, unavailable)
extension ExtendMe {
  func osx_app_extension_extension_available_method() {} // expected-note {{'osx_app_extension_extension_available_method()' has been explicitly marked unavailable here}}

  @available(OSX 99, *)
  func osx_app_extension_extension_osx_future_method() {} // expected-note {{'osx_app_extension_extension_osx_future_method()'}}

  func osx_app_extension_extension_available_method(
    _: NeverAvailable,
    _: OSXUnavailable,
    _: OSXAppExtensionsUnavailable
  ) {
    never() // expected-error {{'never()' is unavailable}}
    osx() // expected-error {{'osx()' is unavailable}}
    osx_extension()
  }

  @available(*, unavailable)
  func osx_app_extension_extension_never_available_method(
    _: NeverAvailable,
    _: OSXUnavailable,
    _: OSXAppExtensionsUnavailable
  ) {
    never() // expected-error {{'never()' is unavailable}}
    osx()
    osx_extension()
  }

  @available(OSX, unavailable)
  func osx_app_extension_extension_osx_method(
    _: NeverAvailable,
    _: OSXUnavailable,
    _: OSXAppExtensionsUnavailable
  ) {
    never() // expected-error {{'never()' is unavailable}}
    osx()
    osx_extension()
  }

  @available(OSXApplicationExtension, unavailable)
  func osx_app_extension_extension_osx_app_extension_method(
    _: NeverAvailable,
    _: OSXUnavailable,
    _: OSXAppExtensionsUnavailable
  ) {
    never() // expected-error {{'never()' is unavailable}}
    osx() // expected-error {{'osx()' is unavailable}}
    osx_extension()
  }
}

func available_func_call_extension_methods(_ e: ExtendMe) {
  e.never_available_extension_available_method() // expected-error {{'never_available_extension_available_method()' is unavailable}}
  e.osx_extension_available_method() // expected-error {{'osx_extension_available_method()' is unavailable in macOS}}
  e.osx_app_extension_extension_available_method() // expected-error {{'osx_app_extension_extension_available_method()' is unavailable in application extensions for macOS}}

  // rdar://92551870
  e.never_available_extension_osx_future_method() // expected-error {{'never_available_extension_osx_future_method()' is unavailable}}
  e.osx_extension_osx_future_method() // expected-error {{'osx_extension_osx_future_method()' is unavailable in macOS}}
  e.osx_app_extension_extension_osx_future_method() // expected-error {{'osx_app_extension_extension_osx_future_method()' is unavailable in application extensions for macOS}}
}


@available(OSXApplicationExtension, introduced: 99)
func osx_app_extensions_future() {}

func call_osx_app_extensions_future() { // expected-note {{add @available attribute to enclosing global function}} {{1-1=@available(macOSApplicationExtension 99, *)\n}}
  osx_app_extensions_future() // expected-error {{'osx_app_extensions_future()' is only available in application extensions for macOS 99 or newer}}
  // expected-note@-1 {{add 'if #available' version check}} {{3-30=if #available(macOS 99, *) {\n      osx_app_extensions_future()\n  \} else {\n      // Fallback on earlier versions\n  \}}}
}