Home | History | Annotate | Download | only in SemaObjC
      1 // RUN: %clang_cc1 -fsyntax-only -Wno-incomplete-implementation -verify -fblocks %s
      2 
      3 #define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
      4 
      5 void fnfoo(void) NS_DESIGNATED_INITIALIZER; // expected-error {{only applies to init methods of interface or class extension declarations}}
      6 
      7 @protocol P1
      8 -(id)init NS_DESIGNATED_INITIALIZER; // expected-error {{only applies to init methods of interface or class extension declarations}}
      9 @end
     10 
     11 __attribute__((objc_root_class))
     12 @interface I1
     13 -(void)meth NS_DESIGNATED_INITIALIZER; // expected-error {{only applies to init methods of interface or class extension declarations}}
     14 -(id)init NS_DESIGNATED_INITIALIZER;
     15 +(id)init NS_DESIGNATED_INITIALIZER; // expected-error {{only applies to init methods of interface or class extension declarations}}
     16 @end
     17 
     18 @interface I1(cat)
     19 -(id)init2 NS_DESIGNATED_INITIALIZER; // expected-error {{only applies to init methods of interface or class extension declarations}}
     20 @end
     21 
     22 @interface I1()
     23 -(id)init3 NS_DESIGNATED_INITIALIZER;
     24 @end
     25 
     26 @implementation I1
     27 -(void)meth {}
     28 -(id)init NS_DESIGNATED_INITIALIZER { return 0; } // expected-error {{only applies to init methods of interface or class extension declarations}}
     29 +(id)init { return 0; }
     30 -(id)init3 { return 0; }
     31 -(id)init4 NS_DESIGNATED_INITIALIZER { return 0; } // expected-error {{only applies to init methods of interface or class extension declarations}} \
     32 									 			   // expected-warning {{convenience initializer missing a 'self' call to another initializer}}
     33 @end
     34 
     35 __attribute__((objc_root_class))
     36 @interface B1
     37 -(id)initB1 NS_DESIGNATED_INITIALIZER; // expected-note 6 {{method marked as designated initializer of the class here}}
     38 -(id)initB2;
     39 @end
     40 
     41 @interface B1()
     42 -(id)initB3 NS_DESIGNATED_INITIALIZER; // expected-note 4 {{method marked as designated initializer of the class here}}
     43 @end;
     44 
     45 @implementation B1
     46 -(id)initB1 { return 0; }
     47 -(id)initB2 { return 0; } // expected-warning {{convenience initializer missing a 'self' call to another initializer}}
     48 -(id)initB3 { return 0; }
     49 @end
     50 
     51 @interface S1 : B1
     52 -(id)initS1 NS_DESIGNATED_INITIALIZER; // expected-note {{method marked as designated initializer of the class here}}
     53 -(id)initS2 NS_DESIGNATED_INITIALIZER;
     54 -(id)initS3 NS_DESIGNATED_INITIALIZER; // expected-note 2 {{method marked as designated initializer of the class here}}
     55 -(id)initB1;
     56 @end
     57 
     58 @interface S1()
     59 -(id)initS4 NS_DESIGNATED_INITIALIZER; // expected-note 2 {{method marked as designated initializer of the class here}}
     60 @end
     61 
     62 @implementation S1
     63 -(id)initS1 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}
     64   return 0;
     65 }
     66 -(id)initS2 {
     67   return [super initB1];
     68 }
     69 -(id)initS3 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}
     70   return [super initB2]; // expected-warning {{designated initializer invoked a non-designated initializer}}
     71 }
     72 -(id)initS4 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}
     73   return [self initB1]; // expected-warning {{designated initializer should only invoke a designated initializer on 'super'}}
     74 }
     75 -(id)initB1 {
     76   return [self initS1];
     77 }
     78 -(id)initB3 {
     79   return [self initS1];
     80 }
     81 @end
     82 
     83 @interface S2 : B1
     84 -(id)initB1;
     85 @end
     86 
     87 @interface SS2 : S2
     88 -(id)initSS1 NS_DESIGNATED_INITIALIZER;
     89 @end
     90 
     91 @implementation SS2 // expected-warning {{method override for the designated initializer of the superclass '-initB1' not found}} \
     92                     // expected-warning {{method override for the designated initializer of the superclass '-initB3' not found}}
     93 -(id)initSS1 {
     94   return [super initB1];
     95 }
     96 @end
     97 
     98 @interface S3 : B1
     99 -(id)initS1 NS_DESIGNATED_INITIALIZER; // expected-note {{method marked as designated initializer of the class here}}
    100 @end
    101 
    102 @interface SS3 : S3
    103 -(id)initSS1 NS_DESIGNATED_INITIALIZER; // expected-note 2 {{method marked as designated initializer of the class here}}
    104 @end
    105 
    106 @implementation SS3 // expected-warning {{method override for the designated initializer of the superclass '-initS1' not found}}
    107 -(id)initSS1 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}
    108   return [super initB1]; // expected-warning {{designated initializer invoked a non-designated initializer}}
    109 }
    110 @end
    111 
    112 @interface S4 : B1
    113 -(id)initB1;
    114 -(id)initB3;
    115 @end
    116 
    117 @implementation S4
    118 -(id)initB1 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}
    119   return 0;
    120 }
    121 -(id)initB3 {
    122   return [super initB3];
    123 }
    124 @end
    125 
    126 @interface S5 : B1
    127 -(void)meth;
    128 @end
    129 
    130 @implementation S5
    131 -(id)initB1 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}
    132   return 0;
    133 }
    134 -(id)initB3 {
    135   [self initB1]; // expected-warning {{designated initializer should only invoke a designated initializer on 'super'}}
    136   S5 *s;
    137   [s initB1];
    138   [self meth];
    139   void (^blk)(void) = ^{
    140     [self initB1]; // expected-warning {{designated initializer should only invoke a designated initializer on 'super'}}
    141   };
    142   return [super initB3];
    143 }
    144 -(void)meth {}
    145 @end
    146 
    147 @interface S6 : B1
    148 -(id)initS1 NS_DESIGNATED_INITIALIZER;
    149 -(id)initS2;
    150 -(id)initS3;
    151 -(id)initS4;
    152 @end
    153 
    154 @implementation S6 // expected-warning {{method override for the designated initializer of the superclass '-initB1' not found}} \
    155                    // expected-warning {{method override for the designated initializer of the superclass '-initB3' not found}}
    156 -(id)initS1 {
    157   return [super initB1];
    158 }
    159 -(id)initS2 { // expected-warning {{convenience initializer missing a 'self' call to another initializer}}
    160   return [super initB1]; // expected-warning {{convenience initializer should not invoke an initializer on 'super'}}
    161 }
    162 -(id)initS3 {
    163   return [self initB1];
    164 }
    165 -(id)initS4 {
    166   return [self initS1];
    167 }
    168 -(id)initS5 {
    169   [super initB1]; // expected-warning {{convenience initializer should not invoke an initializer on 'super'}}
    170   void (^blk)(void) = ^{
    171     [super initB1]; // expected-warning {{convenience initializer should not invoke an initializer on 'super'}}
    172   };
    173   return [self initS1];
    174 }
    175 -(id)initS6 { // expected-warning {{convenience initializer missing a 'self' call to another initializer}}
    176   S6 *s;
    177   return [s initS1];
    178 }
    179 @end
    180 
    181 @interface SS4 : S4
    182 -(id)initB1;
    183 @end
    184 
    185 @implementation SS4
    186 -(id)initB1 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}
    187   return 0;
    188 }
    189 @end
    190 
    191 @interface S7 : B1
    192 -(id)initB1;
    193 -(id)initB3;
    194 -(id)initNewOne;
    195 @end
    196 
    197 @interface SS7 : S7
    198 -(id)initB1;
    199 @end
    200 
    201 @implementation SS7
    202 -(id)initB1 {
    203   return 0;
    204 }
    205 @end
    206 
    207 __attribute__((objc_root_class))
    208 @interface B2
    209 -(id)init;
    210 @end
    211 
    212 @interface S8: B2
    213 -(id)initS8 NS_DESIGNATED_INITIALIZER;
    214 @end
    215 
    216 @implementation S8
    217 -(id)initS8
    218 {
    219   return [super init];
    220 }
    221 @end
    222 
    223 @interface S9 : B1
    224 -(id)initB1;
    225 -(id)initB3;
    226 @end
    227 
    228 @interface S9(secondInit)
    229 -(id)initNewOne;
    230 @end
    231 
    232 @interface SS9 : S9
    233 -(id)initB1;
    234 @end
    235 
    236 @implementation SS9
    237 -(id)initB1 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}
    238   return 0;
    239 }
    240 @end
    241 
    242 // rdar://16261494
    243 @class GEOPDAnalyticMetadata; // expected-note {{forward declaration of class here}}
    244 
    245 @implementation GEOPDAnalyticMetadata (PlaceCardExtras) // expected-error {{cannot find interface declaration for 'GEOPDAnalyticMetadata'}}
    246 - (instancetype)initInProcess
    247 {
    248     return ((void*)0);
    249 }
    250 @end
    251 
    252 // rdar://16305460
    253 __attribute__((objc_root_class))
    254 @interface MyObject
    255 - (instancetype)initWithStuff:(id)stuff __attribute__((objc_designated_initializer));
    256 - (instancetype)init __attribute__((unavailable));
    257 @end
    258 
    259 @implementation MyObject
    260 - (instancetype)init
    261 {
    262    return ((void*)0);
    263 }
    264 @end
    265 
    266 // rdar://16323233
    267 __attribute__((objc_root_class))
    268 @interface B4 
    269 -(id)initB4 NS_DESIGNATED_INITIALIZER; // expected-note 4 {{method marked as designated initializer of the class here}}
    270 -(id)initNonDI;
    271 @end
    272 
    273 @interface rdar16323233 : B4
    274 -(id)initS4 NS_DESIGNATED_INITIALIZER;
    275 @end
    276 
    277 @implementation rdar16323233
    278 -(id)initS4 {
    279     static id sSharedObject = (void*)0;
    280     (void)^(void) {
    281         sSharedObject = [super initB4];
    282     };
    283     return 0;
    284 }
    285 -(id)initB4 {
    286    return [self initS4];
    287 }
    288 @end
    289 
    290 @interface S1B4 : B4
    291 @end
    292 @implementation S1B4
    293 -(id)initB4 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}
    294    return [super initNonDI]; // expected-warning {{designated initializer invoked a non-designated initializer}}
    295 }
    296 @end
    297 
    298 @interface S2B4 : B4
    299 -(id)initB4;
    300 @end
    301 @implementation S2B4
    302 -(id)initB4 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}
    303    return [super initNonDI]; // expected-warning {{designated initializer invoked a non-designated initializer}}
    304 }
    305 @end
    306 
    307 @interface S3B4 : B4
    308 @end
    309 @implementation S3B4
    310 -(id)initNew {
    311   return [super initB4];
    312 }
    313 -(id)initB4 {
    314    return [self initNew];
    315 }
    316 @end
    317 
    318 @interface S4B4 : B4
    319 -(id)initNew;
    320 @end
    321 @implementation S4B4
    322 -(id)initNew {
    323   return [super initB4];
    324 }
    325 -(id)initB4 {
    326    return [self initNew];
    327 }
    328 @end
    329 
    330 @interface S5B4 : B4
    331 -(id)initB4;
    332 @end
    333 @implementation S5B4
    334 -(id)initNew {
    335   return [super initB4];
    336 }
    337 -(id)initB4 {
    338    return [self initNew];
    339 }
    340 @end
    341 
    342 @interface S6B4 : B4
    343 -(id)initNew;
    344 -(id)initB4;
    345 @end
    346 @implementation S6B4
    347 -(id)initNew {
    348   return [super initB4];
    349 }
    350 -(id)initB4 {
    351    return [self initNew];
    352 }
    353 @end
    354 
    355 __attribute__((objc_root_class))
    356 @interface NSObject
    357 -(instancetype) init NS_DESIGNATED_INITIALIZER; // expected-note {{method marked as designated initializer of the class here}}
    358 @end
    359 
    360 @interface Test3 : NSObject
    361 @end
    362 
    363 @implementation Test3
    364 -(instancetype) initWithBasePath:(id)path {
    365   return [super init];
    366 }
    367 -(instancetype) init {
    368   return [self initWithBasePath:0];
    369 }
    370 @end
    371 
    372 @interface Test1 : NSObject
    373 -(instancetype) init NS_DESIGNATED_INITIALIZER;
    374 @end
    375 @implementation Test1
    376 -(instancetype) init {
    377   return self;
    378 }
    379 @end
    380 
    381 
    382 @interface Test2 : NSObject
    383 @end
    384 @interface SubTest2 : Test2
    385 @end
    386 @implementation SubTest2
    387 -(instancetype) init { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}
    388   return self;
    389 }
    390 @end
    391 
    392 __attribute__((objc_root_class))
    393 @interface RootNoDI
    394 -(id)init;
    395 @end
    396 
    397 @interface Base : RootNoDI
    398 @end
    399 
    400 @implementation Base
    401 @end
    402 
    403 @interface Derived : Base
    404 - (instancetype)initWithInt:(int)n NS_DESIGNATED_INITIALIZER;
    405 @end
    406 
    407 @implementation Derived
    408 - (instancetype)initWithInt:(int)n
    409 {
    410   return [super init];
    411 }
    412 @end
    413