454 lines · plain
1// RUN: %clang_cc1 -fsyntax-only -Wno-incomplete-implementation -verify -fblocks %s2 3#define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))4#define NS_UNAVAILABLE __attribute__((unavailable))5 6void fnfoo(void) NS_DESIGNATED_INITIALIZER; // expected-error {{'objc_designated_initializer' attribute only applies to Objective-C methods}}7 8@protocol P19-(id)init NS_DESIGNATED_INITIALIZER; // expected-error {{only applies to init methods of interface or class extension declarations}}10@end11 12__attribute__((objc_root_class))13@interface I114-(void)meth NS_DESIGNATED_INITIALIZER; // expected-error {{only applies to init methods of interface or class extension declarations}}15-(id)init NS_DESIGNATED_INITIALIZER;16+(id)init NS_DESIGNATED_INITIALIZER; // expected-error {{only applies to init methods of interface or class extension declarations}}17@end18 19@interface I1(cat)20-(id)init2 NS_DESIGNATED_INITIALIZER; // expected-error {{only applies to init methods of interface or class extension declarations}}21@end22 23@interface I1()24-(id)init3 NS_DESIGNATED_INITIALIZER;25@end26 27@implementation I128-(void)meth {}29-(id)init NS_DESIGNATED_INITIALIZER { return 0; } // expected-error {{only applies to init methods of interface or class extension declarations}}30+(id)init { return 0; }31-(id)init3 { return 0; }32-(id)init4 NS_DESIGNATED_INITIALIZER { return 0; } // expected-error {{only applies to init methods of interface or class extension declarations}} \33 // expected-warning {{convenience initializer missing a 'self' call to another initializer}}34@end35 36__attribute__((objc_root_class))37@interface B138-(id)initB1 NS_DESIGNATED_INITIALIZER; // expected-note 6 {{method marked as designated initializer of the class here}}39-(id)initB2;40@end41 42@interface B1()43-(id)initB3 NS_DESIGNATED_INITIALIZER; // expected-note 4 {{method marked as designated initializer of the class here}}44@end;45 46@implementation B147-(id)initB1 { return 0; }48-(id)initB2 { return 0; } // expected-warning {{convenience initializer missing a 'self' call to another initializer}}49-(id)initB3 { return 0; }50@end51 52@interface S1 : B153-(id)initS1 NS_DESIGNATED_INITIALIZER; // expected-note {{method marked as designated initializer of the class here}}54-(id)initS2 NS_DESIGNATED_INITIALIZER;55-(id)initS3 NS_DESIGNATED_INITIALIZER; // expected-note 2 {{method marked as designated initializer of the class here}}56-(id)initB1;57@end58 59@interface S1()60-(id)initS4 NS_DESIGNATED_INITIALIZER; // expected-note 2 {{method marked as designated initializer of the class here}}61@end62 63@implementation S164-(id)initS1 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}65 return 0;66}67-(id)initS2 {68 return [super initB1];69}70-(id)initS3 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}71 return [super initB2]; // expected-warning {{designated initializer invoked a non-designated initializer}}72}73-(id)initS4 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}74 return [self initB1]; // expected-warning {{designated initializer should only invoke a designated initializer on 'super'}}75}76-(id)initB1 {77 return [self initS1];78}79-(id)initB3 {80 return [self initS1];81}82@end83 84@interface S2 : B185-(id)initB1;86@end87 88@interface SS2 : S289-(id)initSS1 NS_DESIGNATED_INITIALIZER;90@end91 92@implementation SS2 // expected-warning {{method override for the designated initializer of the superclass '-initB1' not found}} \93 // expected-warning {{method override for the designated initializer of the superclass '-initB3' not found}}94-(id)initSS1 {95 return [super initB1];96}97@end98 99@interface S3 : B1100-(id)initS1 NS_DESIGNATED_INITIALIZER; // expected-note {{method marked as designated initializer of the class here}}101@end102 103@interface SS3 : S3104-(id)initSS1 NS_DESIGNATED_INITIALIZER; // expected-note 2 {{method marked as designated initializer of the class here}}105@end106 107@implementation SS3 // expected-warning {{method override for the designated initializer of the superclass '-initS1' not found}}108-(id)initSS1 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}109 return [super initB1]; // expected-warning {{designated initializer invoked a non-designated initializer}}110}111@end112 113@interface S4 : B1114-(id)initB1;115-(id)initB3;116@end117 118@implementation S4119-(id)initB1 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}120 return 0;121}122-(id)initB3 {123 return [super initB3];124}125@end126 127@interface S5 : B1128-(void)meth;129@end130 131@implementation S5132-(id)initB1 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}133 return 0;134}135-(id)initB3 {136 [self initB1]; // expected-warning {{designated initializer should only invoke a designated initializer on 'super'}}137 S5 *s;138 [s initB1];139 [self meth];140 void (^blk)(void) = ^{141 [self initB1]; // expected-warning {{designated initializer should only invoke a designated initializer on 'super'}}142 };143 return [super initB3];144}145-(void)meth {}146@end147 148@interface S6 : B1149-(id)initS1 NS_DESIGNATED_INITIALIZER;150-(id)initS2;151-(id)initS3;152-(id)initS4;153@end154 155@implementation S6 // expected-warning {{method override for the designated initializer of the superclass '-initB1' not found}} \156 // expected-warning {{method override for the designated initializer of the superclass '-initB3' not found}}157-(id)initS1 {158 return [super initB1];159}160-(id)initS2 { // expected-warning {{convenience initializer missing a 'self' call to another initializer}}161 return [super initB1]; // expected-warning {{convenience initializer should not invoke an initializer on 'super'}}162}163-(id)initS3 {164 return [self initB1];165}166-(id)initS4 {167 return [self initS1];168}169-(id)initS5 {170 [super initB1]; // expected-warning {{convenience initializer should not invoke an initializer on 'super'}}171 void (^blk)(void) = ^{172 [super initB1]; // expected-warning {{convenience initializer should not invoke an initializer on 'super'}}173 };174 return [self initS1];175}176-(id)initS6 { // expected-warning {{convenience initializer missing a 'self' call to another initializer}}177 S6 *s;178 return [s initS1];179}180@end181 182@interface SS4 : S4183-(id)initB1;184@end185 186@implementation SS4187-(id)initB1 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}188 return 0;189}190@end191 192@interface S7 : B1193-(id)initB1;194-(id)initB3;195-(id)initNewOne;196@end197 198@interface SS7 : S7199-(id)initB1;200@end201 202@implementation SS7203-(id)initB1 {204 return 0;205}206@end207 208__attribute__((objc_root_class))209@interface B2210-(id)init;211@end212 213@interface S8: B2214-(id)initS8 NS_DESIGNATED_INITIALIZER;215@end216 217@implementation S8218-(id)initS8219{220 return [super init];221}222@end223 224@interface S9 : B1225-(id)initB1;226-(id)initB3;227@end228 229@interface S9(secondInit)230-(id)initNewOne;231@end232 233@interface SS9 : S9234-(id)initB1;235@end236 237@implementation SS9238-(id)initB1 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}239 return 0;240}241@end242 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)initInProcess247{248 return ((void*)0);249}250@end251 252__attribute__((objc_root_class))253@interface MyObject254- (instancetype)initWithStuff:(id)stuff __attribute__((objc_designated_initializer));255- (instancetype)init NS_UNAVAILABLE;256@end257 258@implementation MyObject259- (instancetype)init260{261 return ((void*)0);262}263@end264 265__attribute__((objc_root_class))266@interface B4 267-(id)initB4 NS_DESIGNATED_INITIALIZER; // expected-note 4 {{method marked as designated initializer of the class here}}268-(id)initNonDI;269@end270 271@interface rdar16323233 : B4272-(id)initS4 NS_DESIGNATED_INITIALIZER;273@end274 275@implementation rdar16323233276-(id)initS4 {277 static id sSharedObject = (void*)0;278 (void)^(void) {279 sSharedObject = [super initB4];280 };281 return 0;282}283-(id)initB4 {284 return [self initS4];285}286@end287 288@interface S1B4 : B4289@end290@implementation S1B4291-(id)initB4 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}292 return [super initNonDI]; // expected-warning {{designated initializer invoked a non-designated initializer}}293}294@end295 296@interface S2B4 : B4297-(id)initB4;298@end299@implementation S2B4300-(id)initB4 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}301 return [super initNonDI]; // expected-warning {{designated initializer invoked a non-designated initializer}}302}303@end304 305@interface S3B4 : B4306@end307@implementation S3B4308-(id)initNew {309 return [super initB4];310}311-(id)initB4 {312 return [self initNew];313}314@end315 316@interface S4B4 : B4317-(id)initNew;318@end319@implementation S4B4320-(id)initNew {321 return [super initB4];322}323-(id)initB4 {324 return [self initNew];325}326@end327 328@interface S5B4 : B4329-(id)initB4;330@end331@implementation S5B4332-(id)initNew {333 return [super initB4];334}335-(id)initB4 {336 return [self initNew];337}338@end339 340@interface S6B4 : B4341-(id)initNew;342-(id)initB4;343@end344@implementation S6B4345-(id)initNew {346 return [super initB4];347}348-(id)initB4 {349 return [self initNew];350}351@end352 353__attribute__((objc_root_class))354@interface NSObject355-(instancetype) init NS_DESIGNATED_INITIALIZER; // expected-note {{method marked as designated initializer of the class here}}356@end357 358@interface Test3 : NSObject359@end360 361@implementation Test3362-(instancetype) initWithBasePath:(id)path {363 return [super init];364}365-(instancetype) init {366 return [self initWithBasePath:0];367}368@end369 370@interface Test1 : NSObject371-(instancetype) init NS_DESIGNATED_INITIALIZER;372@end373@implementation Test1374-(instancetype) init {375 return self;376}377@end378 379@interface SubTest1 : Test1380-(instancetype)init NS_UNAVAILABLE;381-(instancetype)initWithRequiredParameter:(id)foo NS_DESIGNATED_INITIALIZER;382@end383@implementation SubTest1384-(instancetype)initWithRequiredParameter:(id)foo {385 return [super init];386}387@end388 389@interface SubTest1Ext : Test1390-(instancetype)initWithRequiredParameter:(id)foo NS_DESIGNATED_INITIALIZER;391@end392// Mark 'init' as unavailable in the extension to silence warning.393@interface SubTest1Ext()394-(instancetype)init NS_UNAVAILABLE;395@end396@implementation SubTest1Ext397-(instancetype)initWithRequiredParameter:(id)foo {398 return [super init];399}400@end401 402@interface Test2 : NSObject403@end404@interface SubTest2 : Test2405@end406@implementation SubTest2407-(instancetype) init { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}408 return self;409}410@end411 412__attribute__((objc_root_class))413@interface RootNoDI414-(id)init;415@end416 417@interface Base : RootNoDI418@end419 420@implementation Base421@end422 423@interface Derived : Base424- (instancetype)initWithInt:(int)n NS_DESIGNATED_INITIALIZER;425@end426 427@implementation Derived428- (instancetype)initWithInt:(int)n429{430 return [super init];431}432@end433 434@interface ExtensionForMissingInterface() // expected-error{{cannot find interface declaration}}435- (instancetype)init NS_DESIGNATED_INITIALIZER;436@end437 438@interface CategoryForMissingInterface(Cat) // expected-error{{cannot find interface declaration}}439- (instancetype)init NS_DESIGNATED_INITIALIZER; // expected-error{{only applies to init methods of interface or class extension declarations}}440@end441 442@interface TwoAttrs443-(instancetype)foo444 __attribute__((objc_designated_initializer))445 __attribute__((objc_method_family(init)));446-(instancetype)bar447 __attribute__((objc_method_family(init)))448 __attribute__((objc_designated_initializer));449-(instancetype)baz450 __attribute__((objc_designated_initializer, objc_method_family(init)));451-(instancetype)quux452 __attribute__((objc_method_family(init), objc_designated_initializer));453@end454