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 49void t1(A *a) 50{ 51 [A F]; // expected-warning{{'F' is deprecated}} 52 [a f]; // expected-warning{{'f' is deprecated}} 53} 54 55void t2(id a) 56{ 57 [a f]; // expected-warning {{'f' is deprecated}} 58} 59 60void t3(A<P>* a) 61{ 62 [a f]; // expected-warning{{'f' is deprecated}} 63 [a p]; // expected-warning{{'p' is deprecated}} 64} 65 66void 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 79int 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 115void 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 128typedef 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 145typedef 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}} \ 199expected-note {{property 'object' is declared deprecated here}} \ 200expected-note {{'setObject:' has been explicitly marked deprecated here}} \ 201expected-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 236id PID = 0; 237const char * func() { 238 return [PID cString]; // expected-warning {{'cString' is deprecated: first deprecated in macOS 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 269void 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 284void g(id a) { 285 [a anotherPartiallyUnavailableMethod]; // no warning, `a` could be an InterfaceWithImplementation. 286} 287 288typedef struct {} S1 __attribute__((unavailable)); // expected-note2{{marked unavailable here}} 289typedef 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 298