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