]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/SemaObjC/attr-deprecated.m
Vendor import of clang trunk r238337:
[FreeBSD/FreeBSD.git] / test / SemaObjC / attr-deprecated.m
1 // RUN: %clang_cc1 -fsyntax-only -triple x86_64-apple-darwin10.4 -verify -Wno-objc-root-class %s
2 // RUN: %clang_cc1 -x objective-c++ -fsyntax-only -triple x86_64-apple-darwin10.4 -verify -Wno-objc-root-class %s
3
4 @interface A {
5   int X __attribute__((deprecated)); // expected-note 2 {{'X' has been explicitly marked deprecated here}}
6 }
7 + (void)F __attribute__((deprecated)); // expected-note 2 {{'F' has been explicitly marked deprecated here}}
8 - (void)f __attribute__((deprecated)); // expected-note 5 {{'f' has been explicitly marked deprecated here}}
9 @end
10
11 @implementation A
12 + (void)F __attribute__((deprecated))
13 {
14   [self F]; // no warning, since the caller is also deprecated.
15 }
16
17 - (void)g
18 {
19   X++;        // expected-warning{{'X' is deprecated}}
20   self->X++;  // expected-warning{{'X' is deprecated}}
21   [self f]; // expected-warning{{'f' is deprecated}}
22 }
23
24 - (void)f
25 {
26   [self f]; // no warning, the caller is deprecated in its interface.
27 }
28 @end
29
30 @interface B: A
31 @end
32   
33 @implementation B
34 + (void)G
35 {
36   [super F]; // expected-warning{{'F' is deprecated}}
37 }
38
39 - (void)g
40 {
41   [super f]; // // expected-warning{{'f' is deprecated}}
42 }
43 @end
44
45 @protocol P
46 - (void)p __attribute__((deprecated)); // expected-note {{'p' has been explicitly marked deprecated here}}
47 @end
48
49 void t1(A *a)
50 {
51   [A F]; // expected-warning{{'F' is deprecated}}
52   [a f]; // expected-warning{{'f' is deprecated}}
53 }
54
55 void t2(id a)
56 {
57   [a f]; // expected-warning {{'f' is deprecated}}
58 }
59
60 void t3(A<P>* a)
61 {
62   [a f]; // expected-warning{{'f' is deprecated}}
63   [a p]; // expected-warning{{'p' is deprecated}}
64
65
66 void t4(Class c)
67 {
68   [c F];
69 }
70
71
72
73 @interface Bar 
74
75 @property (assign, setter = MySetter:) int FooBar __attribute__ ((deprecated)); // expected-note 2 {{'FooBar' has been explicitly marked deprecated here}}
76 - (void) MySetter : (int) value;
77 @end
78
79 int t5() {
80   Bar *f;
81   f.FooBar = 1;    // expected-warning {{'FooBar' is deprecated}}
82   return f.FooBar; // expected-warning {{'FooBar' is deprecated}}
83 }
84
85
86 __attribute ((deprecated))  
87 @interface DEPRECATED { // expected-note 2 {{'DEPRECATED' has been explicitly marked deprecated here}}
88   @public int ivar; 
89   DEPRECATED *ivar2; // no warning.
90
91 - (int) instancemethod;
92 - (DEPRECATED *) meth; // no warning.
93 @property  int prop; 
94 @end
95
96 @interface DEPRECATED (Category) // no warning.
97 - (DEPRECATED *) meth2; // no warning.
98 @end
99
100 @interface DEPRECATED (Category2) // no warning.
101 @end
102
103 @implementation DEPRECATED (Category2) // expected-warning {{'DEPRECATED' is deprecated}}
104 @end
105
106 @interface NS : DEPRECATED  // expected-warning {{'DEPRECATED' is deprecated}}
107 @end
108
109
110 @interface Test2
111 @property int test2 __attribute__((deprecated)); // expected-note 2 {{property 'test2' is declared deprecated here}} expected-note 3 {{'test2' has been explicitly marked deprecated here}} \
112                                                  // expected-note {{'setTest2:' has been explicitly marked deprecated here}}
113 @end
114
115 void test(Test2 *foo) {
116   int x;
117   x = foo.test2; // expected-warning {{'test2' is deprecated}}
118   x = [foo test2]; // expected-warning {{'test2' is deprecated}}
119   foo.test2 = x; // expected-warning {{'test2' is deprecated}}
120   [foo setTest2: x]; // expected-warning {{'setTest2:' is deprecated}}
121 }
122
123 __attribute__((deprecated))
124 @interface A(Blah) // expected-error{{attributes may not be specified on a category}}
125 @end
126
127
128 typedef struct {
129         int x;
130 } footype __attribute((deprecated)); // expected-note 2 {{'footype' has been explicitly marked deprecated here}}
131
132 @interface foo {
133         footype a; // expected-warning {{'footype' is deprecated}}
134         footype b __attribute((deprecated));
135 }
136 @property footype c; // expected-warning {{'footype' is deprecated}}
137 @property footype d __attribute((deprecated));
138 @end
139
140 // rdar://13569424
141 @interface NewI
142 +(void)cmeth;
143 @end
144
145 typedef NewI DeprI __attribute__((deprecated("blah"))); // expected-note 4 {{'DeprI' has been explicitly marked deprecated here}}
146
147 @interface SI : DeprI // expected-warning {{'DeprI' is deprecated: blah}}
148 -(DeprI*)meth; // expected-warning {{'DeprI' is deprecated: blah}}
149 @end
150
151 @implementation SI
152 -(DeprI*)meth { // expected-warning {{'DeprI' is deprecated: blah}}
153   [DeprI cmeth]; // expected-warning {{'DeprI' is deprecated: blah}}
154   return 0;
155 }
156 @end
157
158 // <rdar://problem/15407366> and <rdar://problem/15466783>:
159 // - Using deprecated class name inside class should not warn about deprecation.
160 // - Implementations of deprecated classes should not result in deprecation warnings.
161 __attribute__((deprecated))
162 @interface DeprecatedClassA
163 @end
164
165 __attribute__((deprecated))
166 @interface DeprecatedClassB
167 // The self-reference return value should not be
168 // flagged as the use of a deprecated declaration.
169 + (DeprecatedClassB *)sharedInstance; // no-warning
170
171 // Since this class is deprecated, returning a reference
172 // to another deprecated class is fine as they may
173 // have been deprecated together.  From a user's
174 // perspective they are all deprecated.
175 + (DeprecatedClassA *)somethingElse; // no-warning
176 @end
177
178 @implementation DeprecatedClassB
179 + (DeprecatedClassB *)sharedInstance
180 {
181   // This self-reference should not
182   // be flagged as a use of a deprecated
183   // declaration.
184   static DeprecatedClassB *x; // no-warning
185   return x;
186 }
187 + (DeprecatedClassA *)somethingElse {
188   // Since this class is deprecated, referencing
189   // another deprecated class is also OK.
190   static DeprecatedClassA *x; // no-warning
191   return x;
192 }
193
194 @end
195
196 // rdar://16068470
197 @interface TestBase
198 @property (nonatomic, strong) id object __attribute__((deprecated("deprecated"))); // expected-note {{'object' has been explicitly marked deprecated here}} \
199 expected-note {{property 'object' is declared deprecated here}} \
200 expected-note {{'setObject:' has been explicitly marked deprecated here}} \
201 expected-note {{property declared here}}
202 @end
203
204 @interface TestDerived : TestBase
205 @property (nonatomic, strong) id object; //expected-warning {{auto property synthesis will not synthesize property 'object'; it will be implemented by its superclass}}
206 @end
207
208 @interface TestUse @end
209
210 @implementation TestBase @end
211
212 @implementation TestDerived @end // expected-note {{detected while default synthesizing properties in class implementation}}
213
214 @implementation TestUse
215
216 - (void) use
217 {
218     TestBase *base = (id)0;
219     TestDerived *derived = (id)0;
220     id object = (id)0;
221
222     base.object = object; // expected-warning {{'object' is deprecated: deprecated}}
223     derived.object = object;
224
225     [base setObject:object];  // expected-warning {{'setObject:' is deprecated: deprecated}}
226     [derived setObject:object];
227 }
228
229 @end
230
231 // rdar://18848183
232 @interface NSString
233 - (const char *)cString __attribute__((availability(macosx,introduced=10.0 ,deprecated=10.4,message="" ))); // expected-note {{'cString' has been explicitly marked deprecated here}}
234 @end
235
236 id PID = 0;
237 const char * func() {
238   return [PID cString]; // expected-warning {{'cString' is deprecated: first deprecated in OS X 10.4}}
239 }
240
241 // rdar://18960378
242 @interface NSObject
243 + (instancetype)alloc;
244 - (instancetype)init;
245 @end
246
247 @interface NSLocale
248 - (instancetype)init __attribute__((unavailable));
249 @end
250
251 @interface PLBatteryProperties : NSObject
252 + (id)properties;
253 @end
254
255 @implementation PLBatteryProperties
256 + (id)properties {
257     return [[self alloc] init];
258 }
259 @end
260
261 @implementation UndeclaredImpl // expected-warning{{cannot find interface declaration}}
262 - (void)partiallyUnavailableMethod {}
263 @end
264
265 @interface InterfaceWithSameMethodAsUndeclaredImpl
266 - (void)partiallyUnavailableMethod __attribute__((unavailable));
267 @end
268
269 void f(id a) {
270   [a partiallyUnavailableMethod]; // no warning, `a` could be an UndeclaredImpl.
271 }
272
273 @interface InterfaceWithImplementation
274 - (void)anotherPartiallyUnavailableMethod;
275 @end
276 @implementation InterfaceWithImplementation
277 - (void)anotherPartiallyUnavailableMethod {}
278 @end
279
280 @interface InterfaceWithSameMethodAsInterfaceWithImplementation
281 - (void)anotherPartiallyUnavailableMethod __attribute__((unavailable));
282 @end
283
284 void g(id a) {
285   [a anotherPartiallyUnavailableMethod]; // no warning, `a` could be an InterfaceWithImplementation.
286 }
287
288 typedef struct {} S1 __attribute__((unavailable)); // expected-note2{{marked unavailable here}}
289 typedef struct {} S2 __attribute__((deprecated)); // expected-note2{{marked deprecated here}}
290 @interface ExtensionForMissingInterface() // expected-error{{cannot find interface declaration}}
291 - (void)method1:(S1) x; // expected-error{{is unavailable}}
292 - (void)method2:(S2) x; // expected-warning{{is deprecated}}
293 @end
294 @interface CategoryForMissingInterface(Cat) // expected-error{{cannot find interface declaration}}
295 - (void)method1:(S1) x; // expected-error{{is unavailable}}
296 - (void)method2:(S2) x; // expected-warning{{is deprecated}}
297 @end