forked from swiftlang/swift
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathdeprecation_osx.swift
169 lines (133 loc) · 6.47 KB
/
deprecation_osx.swift
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
// RUN: %swift -typecheck -parse-as-library -target x86_64-apple-macosx10.51 %clang-importer-sdk -I %S/Inputs/custom-modules %s -verify
// RUN: %swift -typecheck -parse-as-library -target x86_64-apple-macosx10.51 %clang-importer-sdk -I %S/Inputs/custom-modules %s 2>&1 | %FileCheck %s '--implicit-check-not=<unknown>:0'
//
// This test requires a target of OS X 10.51 or later to test deprecation
// diagnostics because (1) we only emit deprecation warnings if a symbol is
// deprecated on all deployment targets and (2) symbols deprecated on 10.9 and
// earlier are imported as unavailable.
//
// We run this test with FileCheck, as well, because the DiagnosticVerifier
// swallows diagnostics from buffers with unknown filenames, which is
// how diagnostics with invalid source locations appear. The
// --implicit-check-not checks to make sure we do not emit any such
// diagnostics with invalid source locations.
// REQUIRES: OS=macosx
import Foundation
func useClassThatTriggersImportOfDeprecatedEnum() {
// Check to make sure that the bodies of enum methods that are synthesized
// when importing deprecated enums do not themselves trigger deprecation
// warnings in the synthesized code.
_ = NSClassWithDeprecatedOptionsInMethodSignature.sharedInstance()
_ = NSClassWithExplicitlyUnavailableOptionsInMethodSignature.sharedInstance()
}
func directUseShouldStillTriggerDeprecationWarning() {
_ = NSDeprecatedOptions.first // expected-warning {{'NSDeprecatedOptions' was deprecated in OS X 10.51: Use a different API}}
_ = NSDeprecatedEnum.first // expected-warning {{'NSDeprecatedEnum' was deprecated in OS X 10.51: Use a different API}}
}
func useInSignature(options: NSDeprecatedOptions) { // expected-warning {{'NSDeprecatedOptions' was deprecated in OS X 10.51: Use a different API}}
}
class Super {
@available(OSX, introduced: 10.9, deprecated: 10.51)
init() { }
}
class Sub : Super {
// The synthesized call to super.init() calls a deprecated constructor, so we
// really should emit a warning. We lost such a warning (with no source
// location) as part of the quick fix for rdar://problem/20007266,
// which involved spurious warnings in synthesized code.
// rdar://problem/20024980 tracks adding a proper warning in this and similar
/// cases.
}
@available(OSX, introduced: 10.9, deprecated: 10.51)
func functionDeprecatedIn10_51() {
_ = ClassDeprecatedIn10_51()
}
@available(OSX, introduced: 10.9, deprecated: 10.9)
class ClassDeprecatedIn10_9 {
}
@available(OSX, introduced: 10.8, deprecated: 10.51)
class ClassDeprecatedIn10_51 {
var other10_51: ClassDeprecatedIn10_51 = ClassDeprecatedIn10_51()
func usingDeprecatedIn10_9() {
// Following clang, we don't warn here even though we are using a class
// that was deprecated before the containing class was deprecated. The
// policy is to not warn if the use is inside a declaration that
// is deprecated on all deployment targets. We can revisit this policy
// if needed.
_ = ClassDeprecatedIn10_9()
}
}
class ClassWithComputedPropertyDeprecatedIn10_51 {
@available(OSX, introduced: 10.8, deprecated: 10.51)
var annotatedPropertyDeprecatedIn10_51 : ClassDeprecatedIn10_51 {
get {
return ClassDeprecatedIn10_51()
}
set(newValue) {
_ = ClassDeprecatedIn10_51()
}
}
// We really shouldn't be emitting three warnings here. It looks like
// we are emitting one for each of the setter and getter, as well.
var unannotatedPropertyDeprecatedIn10_51 : ClassDeprecatedIn10_51 { // expected-warning 3{{ClassDeprecatedIn10_51' was deprecated in OS X 10.51}}
get {
return ClassDeprecatedIn10_51() // expected-warning {{ClassDeprecatedIn10_51' was deprecated in OS X 10.51}}
}
set(newValue) {
_ = ClassDeprecatedIn10_51() // expected-warning {{ClassDeprecatedIn10_51' was deprecated in OS X 10.51}}
}
}
var unannotatedStoredPropertyOfTypeDeprecatedIn10_51 : ClassDeprecatedIn10_51? = nil // expected-warning {{ClassDeprecatedIn10_51' was deprecated in OS X 10.51}}
}
func usesFunctionDeprecatedIn10_51() {
_ = ClassDeprecatedIn10_51() // expected-warning {{ClassDeprecatedIn10_51' was deprecated in OS X 10.51}}
}
@available(OSX, introduced: 10.8, deprecated: 10.51)
func annotatedUsesFunctionDeprecatedIn10_51() {
_ = ClassDeprecatedIn10_51()
}
func hasParameterDeprecatedIn10_51(p: ClassDeprecatedIn10_51) { // expected-warning {{ClassDeprecatedIn10_51' was deprecated in OS X 10.51}}
}
@available(OSX, introduced: 10.8, deprecated: 10.51)
func annotatedHasParameterDeprecatedIn10_51(p: ClassDeprecatedIn10_51) {
}
func hasReturnDeprecatedIn10_51() -> ClassDeprecatedIn10_51 { // expected-warning {{ClassDeprecatedIn10_51' was deprecated in OS X 10.51}}
}
@available(OSX, introduced: 10.8, deprecated: 10.51)
func annotatedHasReturnDeprecatedIn10_51() -> ClassDeprecatedIn10_51 {
}
var globalWithDeprecatedType : ClassDeprecatedIn10_51? = nil // expected-warning {{ClassDeprecatedIn10_51' was deprecated in OS X 10.51}}
@available(OSX, introduced: 10.8, deprecated: 10.51)
var annotatedGlobalWithDeprecatedType : ClassDeprecatedIn10_51?
enum EnumWithDeprecatedCasePayload {
case WithDeprecatedPayload(p: ClassDeprecatedIn10_51) // expected-warning {{ClassDeprecatedIn10_51' was deprecated in OS X 10.51}}
@available(OSX, introduced: 10.8, deprecated: 10.51)
case AnnotatedWithDeprecatedPayload(p: ClassDeprecatedIn10_51)
}
extension ClassDeprecatedIn10_51 { // expected-warning {{'ClassDeprecatedIn10_51' was deprecated in OS X 10.51}}
}
@available(OSX, introduced: 10.8, deprecated: 10.51)
extension ClassDeprecatedIn10_51 {
func methodInExtensionOfClassDeprecatedIn10_51() {
}
}
func callMethodInDeprecatedExtension() {
let o = ClassDeprecatedIn10_51() // expected-warning {{'ClassDeprecatedIn10_51' was deprecated in OS X 10.51}}
o.methodInExtensionOfClassDeprecatedIn10_51() // expected-warning {{'methodInExtensionOfClassDeprecatedIn10_51()' was deprecated in OS X 10.51}}
}
func functionWithDeprecatedMethodInDeadElseBranch() {
if #available(iOS 8.0, *) {
} else {
// This branch is dead on OS X, so we shouldn't emit a deprecation warning in it.
let _ = ClassDeprecatedIn10_9() // no-warning
}
if #available(OSX 10.9, *) { // no-warning
} else {
// This branch is dead because our minimum deployment target is 10.51.
let _ = ClassDeprecatedIn10_9() // no-warning
}
guard #available(iOS 8.0, *) else {
// This branch is dead because our platform is OS X, so the wildcard always matches.
let _ = ClassDeprecatedIn10_9() // no-warning
}
}