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
5 int X __attribute__((deprecated)); // expected-note 2 {{'X' has been explicitly marked deprecated here}}
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}}
12 + (void)F __attribute__((deprecated))
14 [self F]; // no warning, since the caller is also deprecated.
19 X++; // expected-warning{{'X' is deprecated}}
20 self->X++; // expected-warning{{'X' is deprecated}}
21 [self f]; // expected-warning{{'f' is deprecated}}
26 [self f]; // no warning, the caller is deprecated in its interface.
36 [super F]; // expected-warning{{'F' is deprecated}}
41 [super f]; // // expected-warning{{'f' is deprecated}}
46 - (void)p __attribute__((deprecated)); // expected-note {{'p' has been explicitly marked deprecated here}}
51 [A F]; // expected-warning{{'F' is deprecated}}
52 [a f]; // expected-warning{{'f' is deprecated}}
57 [a f]; // expected-warning {{'f' is deprecated}}
62 [a f]; // expected-warning{{'f' is deprecated}}
63 [a p]; // expected-warning{{'p' is deprecated}}
75 @property (assign, setter = MySetter:) int FooBar __attribute__ ((deprecated)); // expected-note 2 {{'FooBar' has been explicitly marked deprecated here}}
76 - (void) MySetter : (int) value;
81 f.FooBar = 1; // expected-warning {{'FooBar' is deprecated}}
82 return f.FooBar; // expected-warning {{'FooBar' is deprecated}}
86 __attribute ((deprecated))
87 @interface DEPRECATED { // expected-note 2 {{'DEPRECATED' has been explicitly marked deprecated here}}
89 DEPRECATED *ivar2; // no warning.
91 - (int) instancemethod;
92 - (DEPRECATED *) meth; // no warning.
96 @interface DEPRECATED (Category) // no warning.
97 - (DEPRECATED *) meth2; // no warning.
100 @interface DEPRECATED (Category2) // no warning.
103 @implementation DEPRECATED (Category2) // expected-warning {{'DEPRECATED' is deprecated}}
106 @interface NS : DEPRECATED // expected-warning {{'DEPRECATED' is deprecated}}
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}}
115 void test(Test2 *foo) {
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}}
123 __attribute__((deprecated))
124 @interface A(Blah) // expected-error{{attributes may not be specified on a category}}
130 } footype __attribute((deprecated)); // expected-note 2 {{'footype' has been explicitly marked deprecated here}}
133 footype a; // expected-warning {{'footype' is deprecated}}
134 footype b __attribute((deprecated));
136 @property footype c; // expected-warning {{'footype' is deprecated}}
137 @property footype d __attribute((deprecated));
145 typedef NewI DeprI __attribute__((deprecated("blah"))); // expected-note 4 {{'DeprI' has been explicitly marked deprecated here}}
147 @interface SI : DeprI // expected-warning {{'DeprI' is deprecated: blah}}
148 -(DeprI*)meth; // expected-warning {{'DeprI' is deprecated: blah}}
152 -(DeprI*)meth { // expected-warning {{'DeprI' is deprecated: blah}}
153 [DeprI cmeth]; // expected-warning {{'DeprI' is deprecated: blah}}
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
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
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
178 @implementation DeprecatedClassB
179 + (DeprecatedClassB *)sharedInstance
181 // This self-reference should not
182 // be flagged as a use of a deprecated
184 static DeprecatedClassB *x; // no-warning
187 + (DeprecatedClassA *)somethingElse {
188 // Since this class is deprecated, referencing
189 // another deprecated class is also OK.
190 static DeprecatedClassA *x; // no-warning
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}}
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}}
208 @interface TestUse @end
210 @implementation TestBase @end
212 @implementation TestDerived @end // expected-note {{detected while default synthesizing properties in class implementation}}
214 @implementation TestUse
218 TestBase *base = (id)0;
219 TestDerived *derived = (id)0;
222 base.object = object; // expected-warning {{'object' is deprecated: deprecated}}
223 derived.object = object;
225 [base setObject:object]; // expected-warning {{'setObject:' is deprecated: deprecated}}
226 [derived setObject:object];
233 - (const char *)cString __attribute__((availability(macosx,introduced=10.0 ,deprecated=10.4,message="" ))); // expected-note {{'cString' has been explicitly marked deprecated here}}
237 const char * func() {
238 return [PID cString]; // expected-warning {{'cString' is deprecated: first deprecated in OS X 10.4}}
243 + (instancetype)alloc;
244 - (instancetype)init;
248 - (instancetype)init __attribute__((unavailable));
251 @interface PLBatteryProperties : NSObject
255 @implementation PLBatteryProperties
257 return [[self alloc] init];
261 @implementation UndeclaredImpl // expected-warning{{cannot find interface declaration}}
262 - (void)partiallyUnavailableMethod {}
265 @interface InterfaceWithSameMethodAsUndeclaredImpl
266 - (void)partiallyUnavailableMethod __attribute__((unavailable));
270 [a partiallyUnavailableMethod]; // no warning, `a` could be an UndeclaredImpl.
273 @interface InterfaceWithImplementation
274 - (void)anotherPartiallyUnavailableMethod;
276 @implementation InterfaceWithImplementation
277 - (void)anotherPartiallyUnavailableMethod {}
280 @interface InterfaceWithSameMethodAsInterfaceWithImplementation
281 - (void)anotherPartiallyUnavailableMethod __attribute__((unavailable));
285 [a anotherPartiallyUnavailableMethod]; // no warning, `a` could be an InterfaceWithImplementation.
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}}
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}}