brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.4 KiB · 4b94671 Raw
307 lines · plain
1// RUN: %clang_cc1 -fsyntax-only -triple x86_64-apple-darwin10.4 -verify -Wno-objc-root-class %s2// RUN: %clang_cc1 -x objective-c++ -fsyntax-only -triple x86_64-apple-darwin10.4 -verify -Wno-objc-root-class %s3 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@end10 11@implementation A12+ (void)F __attribute__((deprecated))13{14  [self F]; // no warning, since the caller is also deprecated.15}16 17- (void)g18{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)f25{26  [self f]; // no warning, the caller is deprecated in its interface.27}28@end29 30@interface B: A31@end32  33@implementation B34+ (void)G35{36  [super F]; // expected-warning{{'F' is deprecated}}37}38 39- (void)g40{41  [super f]; // // expected-warning{{'f' is deprecated}}42}43@end44 45@protocol P46- (void)p __attribute__((deprecated)); // expected-note {{'p' has been explicitly marked deprecated here}}47@end48 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@end78 79int t5(void) {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)) // expected-note {{'DEPRECATED' has been explicitly marked deprecated here}}87@interface DEPRECATED { 88  @public int ivar; 89  DEPRECATED *ivar2; // no warning.90} 91- (int) instancemethod;92- (DEPRECATED *) meth; // no warning.93@property  int prop; 94@end95 96@interface DEPRECATED (Category) // no warning.97- (DEPRECATED *) meth2; // no warning.98@end99 100@interface DEPRECATED (Category2) // no warning.101- (id)meth;102@end103 104__attribute__((deprecated))105void depr_function(void);106 107@implementation DEPRECATED (Category2) // no warning108- (id)meth {109  depr_function(); // no warning.110  return 0;111}112@end113 114@interface NS : DEPRECATED  // expected-warning {{'DEPRECATED' is deprecated}}115@end116 117 118@interface Test2119@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}}121@end122 123void test(Test2 *foo) {124  int x;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}}129}130 131__attribute__((deprecated))132@interface A(Blah) // no warning133- (A*)getA;134@end135 136@implementation A(Blah) // Don't warn by default137- (A*)getA {138  return self;139}140@end141 142typedef struct {143	int x;144} footype __attribute((deprecated)); // expected-note 2 {{'footype' has been explicitly marked deprecated here}}145 146@interface foo {147	footype a; // expected-warning {{'footype' is deprecated}}148	footype b __attribute((deprecated));149}150@property footype c; // expected-warning {{'footype' is deprecated}}151@property footype d __attribute((deprecated));152@end153 154@interface NewI155+(void)cmeth;156@end157 158typedef NewI DeprI __attribute__((deprecated("blah"))); // expected-note 4 {{'DeprI' has been explicitly marked deprecated here}}159 160@interface SI : DeprI // expected-warning {{'DeprI' is deprecated: blah}}161-(DeprI*)meth; // expected-warning {{'DeprI' is deprecated: blah}}162@end163 164@implementation SI165-(DeprI*)meth { // expected-warning {{'DeprI' is deprecated: blah}}166  [DeprI cmeth]; // expected-warning {{'DeprI' is deprecated: blah}}167  return 0;168}169@end170 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 DeprecatedClassA175@end176 177__attribute__((deprecated))178@interface DeprecatedClassB179// The self-reference return value should not be180// flagged as the use of a deprecated declaration.181+ (DeprecatedClassB *)sharedInstance; // no-warning182 183// Since this class is deprecated, returning a reference184// to another deprecated class is fine as they may185// have been deprecated together.  From a user's186// perspective they are all deprecated.187+ (DeprecatedClassA *)somethingElse; // no-warning188@end189 190@implementation DeprecatedClassB191+ (DeprecatedClassB *)sharedInstance192{193  // This self-reference should not194  // be flagged as a use of a deprecated195  // declaration.196  static DeprecatedClassB *x; // no-warning197  return x;198}199+ (DeprecatedClassA *)somethingElse {200  // Since this class is deprecated, referencing201  // another deprecated class is also OK.202  static DeprecatedClassA *x; // no-warning203  return x;204}205 206@end207 208@interface TestBase209@property (nonatomic, strong) id object __attribute__((deprecated("deprecated"))); // expected-note {{'object' has been explicitly marked deprecated here}} \210expected-note {{property 'object' is declared deprecated here}} \211expected-note {{'setObject:' has been explicitly marked deprecated here}} \212expected-note {{property declared here}}213@end214 215@interface TestDerived : TestBase216@property (nonatomic, strong) id object; //expected-warning {{auto property synthesis will not synthesize property 'object'; it will be implemented by its superclass}}217@end218 219@interface TestUse @end220 221@implementation TestBase @end222 223@implementation TestDerived @end // expected-note {{detected while default synthesizing properties in class implementation}}224 225@implementation TestUse226 227- (void) use228{229    TestBase *base = (id)0;230    TestDerived *derived = (id)0;231    id object = (id)0;232 233    base.object = object; // expected-warning {{'object' is deprecated: deprecated}}234    derived.object = object;235 236    [base setObject:object];  // expected-warning {{'setObject:' is deprecated: deprecated}}237    [derived setObject:object];238}239 240@end241 242@interface NSString243- (const char *)cString __attribute__((availability(macosx,introduced=10.0 ,deprecated=10.4,message="" ))); // expected-note {{'cString' has been explicitly marked deprecated here}}244@end245 246id PID = 0;247const char * func(void) {248  return [PID cString]; // expected-warning {{'cString' is deprecated: first deprecated in macOS 10.4}}249}250 251@interface NSObject252+ (instancetype)alloc;253- (instancetype)init;254@end255 256@interface NSLocale257- (instancetype)init __attribute__((unavailable));258@end259 260@interface PLBatteryProperties : NSObject261+ (id)properties;262@end263 264@implementation PLBatteryProperties265+ (id)properties {266    return [[self alloc] init];267}268@end269 270@implementation UndeclaredImpl // expected-warning{{cannot find interface declaration}}271- (void)partiallyUnavailableMethod {}272@end273 274@interface InterfaceWithSameMethodAsUndeclaredImpl275- (void)partiallyUnavailableMethod __attribute__((unavailable));276@end277 278void f(id a) {279  [a partiallyUnavailableMethod]; // no warning, `a` could be an UndeclaredImpl.280}281 282@interface InterfaceWithImplementation283- (void)anotherPartiallyUnavailableMethod;284@end285@implementation InterfaceWithImplementation286- (void)anotherPartiallyUnavailableMethod {}287@end288 289@interface InterfaceWithSameMethodAsInterfaceWithImplementation290- (void)anotherPartiallyUnavailableMethod __attribute__((unavailable));291@end292 293void g(id a) {294  [a anotherPartiallyUnavailableMethod]; // no warning, `a` could be an InterfaceWithImplementation.295}296 297typedef struct {} S1 __attribute__((unavailable)); // expected-note2{{marked unavailable here}}298typedef 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}}302@end303@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}}306@end307