File: require_explicit_availability_macos.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 (239 lines) | stat: -rw-r--r-- 9,142 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
// Test the -require-explicit-availability flag
// REQUIRES: OS=macosx
// RUN: %empty-directory(%t)

/// Using the flag directly raises warnings and fixits.
// RUN: %swiftc_driver -typecheck -parse-as-library -Xfrontend -verify %s \
// RUN:   -target %target-cpu-apple-macosx10.10 -require-explicit-availability \
// RUN:   -require-explicit-availability-target "macOS 10.10"
// RUN: %swiftc_driver -typecheck -parse-as-library -Xfrontend -verify %s \
// RUN:   -target %target-cpu-apple-macosx10.10 -require-explicit-availability=warn \
// RUN:   -require-explicit-availability-target "macOS 10.10"

/// Using -library-level api defaults to enabling warnings, without fixits.
// RUN: sed -e "s/}} {{.*/}}/" < %s > %t/NoFixits.swift
// RUN: %target-swift-frontend -typecheck -parse-as-library -verify %t/NoFixits.swift \
// RUN:   -target %target-cpu-apple-macosx10.10 -library-level api

/// Explicitly disable the diagnostic.
// RUN: sed -e 's/xpected-warning/not-something-expected/' < %s > %t/None.swift
// RUN: %target-swift-frontend -typecheck -parse-as-library -verify %t/None.swift \
// RUN:   -target %target-cpu-apple-macosx10.10 -require-explicit-availability=ignore \
// RUN:   -require-explicit-availability-target "macOS 10.10" -library-level api

/// Upgrade the diagnostic to an error.
// RUN: sed -e "s/xpected-warning/xpected-error/" < %s > %t/Errors.swift
// RUN: %target-swift-frontend -typecheck -parse-as-library -verify %t/Errors.swift \
// RUN:   -target %target-cpu-apple-macosx10.10 -require-explicit-availability=error \
// RUN:   -require-explicit-availability-target "macOS 10.10"

/// Error on an invalid argument.
// RUN: not %target-swift-frontend -typecheck %s -require-explicit-availability=NotIt 2>&1 \
// RUN:   | %FileCheck %s --check-prefix CHECK-ARG
// CHECK-ARG: error: unknown argument 'NotIt', passed to -require-explicit-availability, expected 'error', 'warn' or 'ignore'

public struct S { // expected-warning {{public declarations should have an availability attribute with an introduction version}}
  public func method() { }
}

@available(macOS, unavailable)
public struct UnavailableStruct {
  public func okMethod() { }
}

public func foo() { bar() } // expected-warning {{public declarations should have an availability attribute with an introduction version}} {{1-1=@available(macOS 10.10, *)\n}}

@usableFromInline
func bar() { } // expected-warning {{public declarations should have an availability attribute with an introduction version}} {{-1:1-1=@available(macOS 10.10, *)\n}}

@available(macOS 10.1, *)
public func ok() { }

@available(macOS, unavailable)
public func unavailableOk() { }

@available(macOS, deprecated: 10.10)
public func missingIntro() { } // expected-warning {{public declarations should have an availability attribute with an introduction version}} {{-1:1-1=@available(macOS 10.10, *)\n}}

@available(iOS 9.0, *)
public func missingTargetPlatform() { } // expected-warning {{public declarations should have an availability attribute with an introduction version}} {{-1:1-1=@available(macOS 10.10, *)\n}}

func privateFunc() { }

@_alwaysEmitIntoClient
public func alwaysEmitted() { }

@available(macOS 10.1, *)
struct SOk {
  public func okMethod() { }
}

precedencegroup MediumPrecedence {}
infix operator + : MediumPrecedence

public func +(lhs: S, rhs: S) -> S { } // expected-warning {{public declarations should have an availability attribute with an introduction version}} {{1-1=@available(macOS 10.10, *)\n}}

public enum E { } // expected-warning {{public declarations should have an availability attribute with an introduction version}} {{1-1=@available(macOS 10.10, *)\n}}

@available(macOS, unavailable)
public enum UnavailableEnum {
  case caseOk
}

public class C { } // expected-warning {{public declarations should have an availability attribute with an introduction version}} {{1-1=@available(macOS 10.10, *)\n}}

@available(macOS, unavailable)
public class UnavailableClass {
  public func okMethod() { }
}

public protocol P { } // expected-warning {{public declarations should have an availability attribute with an introduction version}} {{1-1=@available(macOS 10.10, *)\n}}

@available(macOS, unavailable)
public protocol UnavailableProto {
  func requirementOk()
}

private protocol PrivateProto { }

extension S { // expected-warning {{public declarations should have an availability attribute with an introduction version}} {{1-1=@available(macOS 10.10, *)\n}}
  public func warnForPublicMembers() { } // expected-warning {{public declarations should have an availability attribute with an introduction version}} {{3-3=@available(macOS 10.10, *)\n  }}
}

@available(macOS 10.1, *)
extension S {
  public func okWhenTheExtensionHasAttribute() { }
}

@available(macOS, unavailable)
extension S {
  public func okWhenTheExtensionIsUnavailable() { }
}

extension S {
  internal func dontWarnWithoutPublicMembers() { }
  private func dontWarnWithoutPublicMembers1() { }
}

// An empty extension should be ok.
extension S { }

extension S : P { // expected-warning {{public declarations should have an availability attribute with an introduction version}} {{1-1=@available(macOS 10.10, *)\n}}
}

extension S : PrivateProto {
}

open class OpenClass { } // expected-warning {{public declarations should have an availability attribute with an introduction version}} {{1-1=@available(macOS 10.10, *)\n}}

private class PrivateClass { }

extension PrivateClass { }

@available(macOS 10.1, *)
public protocol PublicProtocol { }

@available(macOS 10.1, *)
extension S : PublicProtocol { }

@_spi(SPIsAreOK)
public func spiFunc() { }

@_spi(SPIsAreOK)
public struct spiStruct {
  public func spiMethod() {}
}

extension spiStruct {
  public func spiExtensionMethod() {}
}

public var publicVar = S() // expected-warning {{public declarations should have an availability attribute with an introduction version}} {{1-1=@available(macOS 10.10, *)\n}}

@available(macOS 10.10, *)
public var publicVarOk = S()

@available(macOS, unavailable)
public var unavailablePublicVarOk = S()

public var (a, b) = (S(), S()) // expected-warning {{public declarations should have an availability attribute with an introduction version}} {{1-1=@available(macOS 10.10, *)\n}}

@available(macOS 10.10, *)
public var (c, d) = (S(), S())

public var _ = S() // expected-error {{global variable declaration does not bind any variables}}

public var implicitGet: S { // expected-warning {{public declarations should have an availability attribute with an introduction version}} {{1-1=@available(macOS 10.10, *)\n}}
  return S()
}

@available(macOS 10.10, *)
public var implicitGetOk: S {
  return S()
}

@available(macOS, unavailable)
public var unavailableImplicitGetOk: S {
  return S()
}

public var computed: S { // expected-warning {{public declarations should have an availability attribute with an introduction version}} {{1-1=@available(macOS 10.10, *)\n}}
  get { return S() }
  set { }
}

public var computedHalf: S { // expected-warning {{public declarations should have an availability attribute with an introduction version}} {{1-1=@available(macOS 10.10, *)\n}}
  @available(macOS 10.10, *)
  get { return S() }
  set { }
}

// FIXME the following warning is not needed.
public var computedOk: S { // expected-warning {{public declarations should have an availability attribute with an introduction version}} {{1-1=@available(macOS 10.10, *)\n}}
  @available(macOS 10.10, *)
  get { return S() }

  @available(macOS 10.10, *)
  set { }
}

@available(macOS 10.10, *)
public var computedOk1: S {
  get { return S() }
  set { }
}

public class SomeClass { // expected-warning {{public declarations should have an availability attribute with an introduction version}} {{1-1=@available(macOS 10.10, *)\n}}
  public init () {}

  public subscript(index: String) -> Int {
    get { return 42; }
    set(newValue) { }
  }
}

extension SomeClass { // expected-warning {{public declarations should have an availability attribute with an introduction version}} {{1-1=@available(macOS 10.10, *)\n}}
  public convenience init(s : S) {} // expected-warning {{public declarations should have an availability attribute with an introduction version}} {{3-3=@available(macOS 10.10, *)\n  }}

  @available(macOS 10.10, *)
  public convenience init(s : SomeClass) {}

  public subscript(index: Int) -> Int { // expected-warning {{public declarations should have an availability attribute with an introduction version}} {{3-3=@available(macOS 10.10, *)\n  }}
    get { return 42; }
    set(newValue) { }
  }

  @available(macOS 10.10, *)
  public subscript(index: S) -> Int {
    get { return 42; }
    set(newValue) { }
  }
}

@available(iOS 13.0, macOS 10.15, watchOS 6.0, tvOS 13.0, macCatalyst 13.0, *)
public struct StructWithImplicitMembers { }

extension StructWithImplicitMembers: Hashable { }
// expected-note @-1 {{add @available attribute to enclosing extension}}
// expected-warning @-2 {{public declarations should have an availability attribute with an introduction version}}
// expected-error @-3 {{'StructWithImplicitMembers' is only available in macOS 10.15 or newer}}