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 414 @interface ExtensionForMissingInterface() // expected-error{{cannot find interface declaration}} 415 - (instancetype)init NS_DESIGNATED_INITIALIZER; 416 @end 417 418 @interface CategoryForMissingInterface(Cat) // expected-error{{cannot find interface declaration}} 419 - (instancetype)init NS_DESIGNATED_INITIALIZER; // expected-error{{only applies to init methods of interface or class extension declarations}} 420 @end 421