File: attr_availability_transitive_osx.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (190 lines) | stat: -rw-r--r-- 6,676 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
// RUN: %target-typecheck-verify-swift -parse-as-library
// REQUIRES: OS=macosx

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

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

@available(OSXApplicationExtension, unavailable)
func osx_extension() {}

@available(OSX, unavailable)
func osx_pair() -> (Int, Int) { return (0, 0) } // expected-note * {{'osx_pair()' has been explicitly marked unavailable here}}

func call_osx_extension() {
    osx_extension() // OK; osx_extension is only unavailable if -application-extension is passed.
}
func call_osx() {
    osx() // expected-error {{'osx()' is unavailable}}
}

@available(OSX, unavailable)
func osx_call_osx_extension() {
    osx_extension() // OK; osx_extension is only unavailable if -application-extension is passed.
}

@available(OSX, unavailable)
func osx_call_osx() {
    osx() // OK; same
}

@available(OSXApplicationExtension, unavailable)
func osx_extension_call_osx_extension() {
    osx_extension()
}

@available(OSXApplicationExtension, unavailable)
func osx_extension_call_osx() {
    osx() // expected-error {{'osx()' is unavailable}}
}

@available(OSX, unavailable)
var osx_init_osx = osx() // OK

@available(OSXApplicationExtension, unavailable)
var osx_extension_init_osx = osx() // expected-error {{'osx()' is unavailable}}

@available(OSX, unavailable)
var osx_inner_init_osx = { let inner_var = osx() } // OK

@available(OSXApplicationExtension, unavailable)
var osx_extension_inner_init_osx = { let inner_var = osx() } // expected-error {{'osx()' is unavailable}}

struct Outer {
  @available(OSX, unavailable)
  static var osx_init_osx = osx() // OK

  @available(OSXApplicationExtension, unavailable)
  static var osx_extension_init_osx = osx() // expected-error {{'osx()' is unavailable}}

  @available(OSXApplicationExtension, unavailable)
  static var osx_extension_lazy_osx = osx() // expected-error {{'osx()' is unavailable}}

  @available(OSX, unavailable)
  static var osx_init_multi1_osx = osx(), osx_init_multi2_osx = osx() // OK

  @available(OSXApplicationExtension, unavailable)
  static var osx_extension_init_multi1_osx = osx(), osx_extension_init_multi2_osx = osx() // expected-error 2 {{'osx()' is unavailable}}

  @available(OSX, unavailable)
  static var (osx_init_deconstruct1_osx, osx_init_deconstruct2_osx) = osx_pair() // OK

  @available(OSXApplicationExtension, unavailable)
  static var (osx_extension_init_deconstruct1_osx, osx_extension_init_deconstruct2_osx) = osx_pair() // expected-error {{'osx_pair()' is unavailable}}

  @available(OSX, unavailable)
  static var (_, osx_init_deconstruct2_only_osx) = osx_pair() // OK
  
  @available(OSXApplicationExtension, unavailable)
  static var (_, osx_extension_init_deconstruct2_only_osx) = osx_pair() // expected-error {{'osx_pair()' is unavailable}}

  @available(OSX, unavailable)
  static var (osx_init_deconstruct1_only_osx, _) = osx_pair() // OK
  
  @available(OSXApplicationExtension, unavailable)
  static var (osx_extension_init_deconstruct1_only_osx, _) = osx_pair() // expected-error {{'osx_pair()' is unavailable}}

  @available(OSX, unavailable)
  static var osx_inner_init_osx = { let inner_var = osx() } // OK
  
  @available(OSXApplicationExtension, unavailable)
  static var osx_extension_inner_init_osx = { let inner_var = osx() } // expected-error {{'osx()' is unavailable}}
}

extension Outer {
  @available(OSX, unavailable)
  static var also_osx_init_osx = osx() // OK
  
  @available(OSXApplicationExtension, unavailable)
  static var also_osx_extension_init_osx = osx() // expected-error {{'osx()' is unavailable}}
}

@available(OSX, unavailable)
extension Outer {
  // expected-note@+1 {{'outer_osx_init_osx' has been explicitly marked unavailable here}}
  static var outer_osx_init_osx = osx() // OK
  
  // expected-note@+1 {{'osx_call_osx()' has been explicitly marked unavailable here}}
  func osx_call_osx() {
    osx() // OK
  }

  func osx_call_osx_extension() {
    osx_extension() // OK; osx_extension is only unavailable if -application-extension is passed.
  }
  
  func takes_and_returns_osx(_ x: NotOnOSX) -> NotOnOSX {
    return x // OK
  }
  
  // This @available should be ignored; inherited unavailability takes precedence
  @available(OSX 999, *)
  // expected-note@+1 {{'osx_more_available_but_still_unavailable_call_osx()' has been explicitly marked unavailable here}}
  func osx_more_available_but_still_unavailable_call_osx() {
    osx() // OK
  }

  @available(OSX, unavailable)
  func osx_double_unavailable_call_osx() {
    osx() // OK
  }

  @available(*, unavailable)
  func osx_universally_unavailable_call_osx() {
    osx() // OK
  }
  
  // rdar://92551870
  func osx_call_osx_more_available_but_still_unavailable() {
    osx_more_available_but_still_unavailable_call_osx() // OK
  }
}

func takesOuter(_ o: Outer) {
  _ = Outer.outer_osx_init_osx // expected-error {{'outer_osx_init_osx' is unavailable in macOS}}
  o.osx_call_osx() // expected-error {{'osx_call_osx()' is unavailable in macOS}}
  o.osx_more_available_but_still_unavailable_call_osx() // expected-error {{'osx_more_available_but_still_unavailable_call_osx()' is unavailable in macOS}}
}

@available(OSX, unavailable)
struct NotOnOSX { // expected-note {{'NotOnOSX' has been explicitly marked unavailable here}}
  var osx_init_osx = osx() // OK
  lazy var osx_lazy_osx = osx() // OK
  var osx_init_multi1_osx = osx(), osx_init_multi2_osx = osx() // OK
  var (osx_init_deconstruct1_osx, osx_init_deconstruct2_osx) = osx_pair() // OK
  var (_, osx_init_deconstruct2_only_osx) = osx_pair() // OK
  var (osx_init_deconstruct1_only_osx, _) = osx_pair() // OK
}

@available(OSX, unavailable)
extension NotOnOSX {
  func osx_call_osx() {
    osx() // OK
  }

  func osx_call_osx_extension() {
    osx_extension() // OK; osx_extension is only unavailable if -application-extension is passed.
  }
}

@available(OSXApplicationExtension, unavailable)
extension NotOnOSX { } // expected-error {{'NotOnOSX' is unavailable in macOS}}

@available(OSXApplicationExtension, unavailable)
struct NotOnOSXApplicationExtension { }

@available(OSX, unavailable)
extension NotOnOSXApplicationExtension { } // OK; NotOnOSXApplicationExtension is only unavailable if -application-extension is passed.

@available(OSXApplicationExtension, unavailable)
extension NotOnOSXApplicationExtension {
  func osx_call_osx() {
    osx() // expected-error {{'osx()' is unavailable in macOS}}
  }

  func osx_call_osx_extension() {
    osx_extension() // OK
  }
}