Home | History | Annotate | Download | only in SemaObjC
      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 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 
    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
    298