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)) // expected-note {{'DEPRECATED' has been explicitly marked deprecated here}}
87 @interface DEPRECATED {
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.
104 __attribute__((deprecated))
105 void depr_function(void);
107 @implementation DEPRECATED (Category2) // no warning
109 depr_function(); // no warning.
114 @interface NS : DEPRECATED // expected-warning {{'DEPRECATED' is deprecated}}
119 @property int test2 __attribute__((deprecated)); // expected-note 2 {{property 'test2' is declared deprecated here}} expected-note 3 {{'test2' has been explicitly marked deprecated here}} \
120 // expected-note {{'setTest2:' has been explicitly marked deprecated here}}
123 void test(Test2 *foo) {
125 x = foo.test2; // expected-warning {{'test2' is deprecated}}
126 x = [foo test2]; // expected-warning {{'test2' is deprecated}}
127 foo.test2 = x; // expected-warning {{'test2' is deprecated}}
128 [foo setTest2: x]; // expected-warning {{'setTest2:' is deprecated}}
131 __attribute__((deprecated))
132 @interface A(Blah) // no warning
136 @implementation A(Blah) // Don't warn by default
144 } footype __attribute((deprecated)); // expected-note 2 {{'footype' has been explicitly marked deprecated here}}
147 footype a; // expected-warning {{'footype' is deprecated}}
148 footype b __attribute((deprecated));
150 @property footype c; // expected-warning {{'footype' is deprecated}}
151 @property footype d __attribute((deprecated));
158 typedef NewI DeprI __attribute__((deprecated("blah"))); // expected-note 4 {{'DeprI' has been explicitly marked deprecated here}}
160 @interface SI : DeprI // expected-warning {{'DeprI' is deprecated: blah}}
161 -(DeprI*)meth; // expected-warning {{'DeprI' is deprecated: blah}}
165 -(DeprI*)meth { // expected-warning {{'DeprI' is deprecated: blah}}
166 [DeprI cmeth]; // expected-warning {{'DeprI' is deprecated: blah}}
171 // - Using deprecated class name inside class should not warn about deprecation.
172 // - Implementations of deprecated classes should not result in deprecation warnings.
173 __attribute__((deprecated))
174 @interface DeprecatedClassA
177 __attribute__((deprecated))
178 @interface DeprecatedClassB
179 // The self-reference return value should not be
180 // flagged as the use of a deprecated declaration.
181 + (DeprecatedClassB *)sharedInstance; // no-warning
183 // Since this class is deprecated, returning a reference
184 // to another deprecated class is fine as they may
185 // have been deprecated together. From a user's
186 // perspective they are all deprecated.
187 + (DeprecatedClassA *)somethingElse; // no-warning
190 @implementation DeprecatedClassB
191 + (DeprecatedClassB *)sharedInstance
193 // This self-reference should not
194 // be flagged as a use of a deprecated
196 static DeprecatedClassB *x; // no-warning
199 + (DeprecatedClassA *)somethingElse {
200 // Since this class is deprecated, referencing
201 // another deprecated class is also OK.
202 static DeprecatedClassA *x; // no-warning
209 @property (nonatomic, strong) id object __attribute__((deprecated("deprecated"))); // expected-note {{'object' has been explicitly marked deprecated here}} \
210 expected-note {{property 'object' is declared deprecated here}} \
211 expected-note {{'setObject:' has been explicitly marked deprecated here}} \
212 expected-note {{property declared here}}
215 @interface TestDerived : TestBase
216 @property (nonatomic, strong) id object; //expected-warning {{auto property synthesis will not synthesize property 'object'; it will be implemented by its superclass}}
219 @interface TestUse @end
221 @implementation TestBase @end
223 @implementation TestDerived @end // expected-note {{detected while default synthesizing properties in class implementation}}
225 @implementation TestUse
229 TestBase *base = (id)0;
230 TestDerived *derived = (id)0;
233 base.object = object; // expected-warning {{'object' is deprecated: deprecated}}
234 derived.object = object;
236 [base setObject:object]; // expected-warning {{'setObject:' is deprecated: deprecated}}
237 [derived setObject:object];
243 - (const char *)cString __attribute__((availability(macosx,introduced=10.0 ,deprecated=10.4,message="" ))); // expected-note {{'cString' has been explicitly marked deprecated here}}
247 const char * func(void) {
248 return [PID cString]; // expected-warning {{'cString' is deprecated: first deprecated in macOS 10.4}}
252 + (instancetype)alloc;
253 - (instancetype)init;
257 - (instancetype)init __attribute__((unavailable));
260 @interface PLBatteryProperties : NSObject
264 @implementation PLBatteryProperties
266 return [[self alloc] init];
270 @implementation UndeclaredImpl // expected-warning{{cannot find interface declaration}}
271 - (void)partiallyUnavailableMethod {}
274 @interface InterfaceWithSameMethodAsUndeclaredImpl
275 - (void)partiallyUnavailableMethod __attribute__((unavailable));
279 [a partiallyUnavailableMethod]; // no warning, `a` could be an UndeclaredImpl.
282 @interface InterfaceWithImplementation
283 - (void)anotherPartiallyUnavailableMethod;
285 @implementation InterfaceWithImplementation
286 - (void)anotherPartiallyUnavailableMethod {}
289 @interface InterfaceWithSameMethodAsInterfaceWithImplementation
290 - (void)anotherPartiallyUnavailableMethod __attribute__((unavailable));
294 [a anotherPartiallyUnavailableMethod]; // no warning, `a` could be an InterfaceWithImplementation.
297 typedef struct {} S1 __attribute__((unavailable)); // expected-note2{{marked unavailable here}}
298 typedef struct {} S2 __attribute__((deprecated)); // expected-note2{{marked deprecated here}}
299 @interface ExtensionForMissingInterface() // expected-error{{cannot find interface declaration}}
300 - (void)method1:(S1) x; // expected-error{{is unavailable}}
301 - (void)method2:(S2) x; // expected-warning{{is deprecated}}
303 @interface CategoryForMissingInterface(Cat) // expected-error{{cannot find interface declaration}}
304 - (void)method1:(S1) x; // expected-error{{is unavailable}}
305 - (void)method2:(S2) x; // expected-warning{{is deprecated}}