1 // RUN: %clang_cc1 -fsyntax-only -Wno-incomplete-implementation -verify -fblocks %s
3 #define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
4 #define NS_UNAVAILABLE __attribute__((unavailable))
6 void fnfoo(void) NS_DESIGNATED_INITIALIZER; // expected-error {{'objc_designated_initializer' attribute only applies to Objective-C methods}}
9 -(id)init NS_DESIGNATED_INITIALIZER; // expected-error {{only applies to init methods of interface or class extension declarations}}
12 __attribute__((objc_root_class))
14 -(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}}
20 -(id)init2 NS_DESIGNATED_INITIALIZER; // expected-error {{only applies to init methods of interface or class extension declarations}}
24 -(id)init3 NS_DESIGNATED_INITIALIZER;
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}}
36 __attribute__((objc_root_class))
38 -(id)initB1 NS_DESIGNATED_INITIALIZER; // expected-note 6 {{method marked as designated initializer of the class here}}
43 -(id)initB3 NS_DESIGNATED_INITIALIZER; // expected-note 4 {{method marked as designated initializer of the class here}}
47 -(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; }
53 -(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}}
60 -(id)initS4 NS_DESIGNATED_INITIALIZER; // expected-note 2 {{method marked as designated initializer of the class here}}
64 -(id)initS1 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}
68 return [super initB1];
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}}
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'}}
89 -(id)initSS1 NS_DESIGNATED_INITIALIZER;
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}}
95 return [super initB1];
100 -(id)initS1 NS_DESIGNATED_INITIALIZER; // expected-note {{method marked as designated initializer of the class here}}
104 -(id)initSS1 NS_DESIGNATED_INITIALIZER; // expected-note 2 {{method marked as designated initializer of the class here}}
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}}
119 -(id)initB1 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}
123 return [super initB3];
132 -(id)initB1 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}
136 [self initB1]; // expected-warning {{designated initializer should only invoke a designated initializer on 'super'}}
140 void (^blk)(void) = ^{
141 [self initB1]; // expected-warning {{designated initializer should only invoke a designated initializer on 'super'}}
143 return [super initB3];
149 -(id)initS1 NS_DESIGNATED_INITIALIZER;
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}}
158 return [super initB1];
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'}}
164 return [self initB1];
167 return [self initS1];
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'}}
174 return [self initS1];
176 -(id)initS6 { // expected-warning {{convenience initializer missing a 'self' call to another initializer}}
187 -(id)initB1 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}
208 __attribute__((objc_root_class))
214 -(id)initS8 NS_DESIGNATED_INITIALIZER;
229 @interface S9(secondInit)
238 -(id)initB1 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}
244 @class GEOPDAnalyticMetadata; // expected-note {{forward declaration of class here}}
246 @implementation GEOPDAnalyticMetadata (PlaceCardExtras) // expected-error {{cannot find interface declaration for 'GEOPDAnalyticMetadata'}}
247 - (instancetype)initInProcess
254 __attribute__((objc_root_class))
256 - (instancetype)initWithStuff:(id)stuff __attribute__((objc_designated_initializer));
257 - (instancetype)init NS_UNAVAILABLE;
260 @implementation MyObject
268 __attribute__((objc_root_class))
270 -(id)initB4 NS_DESIGNATED_INITIALIZER; // expected-note 4 {{method marked as designated initializer of the class here}}
274 @interface rdar16323233 : B4
275 -(id)initS4 NS_DESIGNATED_INITIALIZER;
278 @implementation rdar16323233
280 static id sSharedObject = (void*)0;
282 sSharedObject = [super initB4];
287 return [self initS4];
294 -(id)initB4 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}
295 return [super initNonDI]; // expected-warning {{designated initializer invoked a non-designated initializer}}
303 -(id)initB4 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}
304 return [super initNonDI]; // expected-warning {{designated initializer invoked a non-designated initializer}}
312 return [super initB4];
315 return [self initNew];
324 return [super initB4];
327 return [self initNew];
336 return [super initB4];
339 return [self initNew];
349 return [super initB4];
352 return [self initNew];
356 __attribute__((objc_root_class))
358 -(instancetype) init NS_DESIGNATED_INITIALIZER; // expected-note {{method marked as designated initializer of the class here}}
361 @interface Test3 : NSObject
364 @implementation Test3
365 -(instancetype) initWithBasePath:(id)path {
368 -(instancetype) init {
369 return [self initWithBasePath:0];
373 @interface Test1 : NSObject
374 -(instancetype) init NS_DESIGNATED_INITIALIZER;
376 @implementation Test1
377 -(instancetype) init {
382 @interface SubTest1 : Test1
383 -(instancetype)init NS_UNAVAILABLE;
384 -(instancetype)initWithRequiredParameter:(id)foo NS_DESIGNATED_INITIALIZER;
386 @implementation SubTest1
387 -(instancetype)initWithRequiredParameter:(id)foo {
392 @interface SubTest1Ext : Test1
393 -(instancetype)initWithRequiredParameter:(id)foo NS_DESIGNATED_INITIALIZER;
395 // Mark 'init' as unavailable in the extension to silence warning.
396 @interface SubTest1Ext()
397 -(instancetype)init NS_UNAVAILABLE;
399 @implementation SubTest1Ext
400 -(instancetype)initWithRequiredParameter:(id)foo {
405 @interface Test2 : NSObject
407 @interface SubTest2 : Test2
409 @implementation SubTest2
410 -(instancetype) init { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}
415 __attribute__((objc_root_class))
420 @interface Base : RootNoDI
426 @interface Derived : Base
427 - (instancetype)initWithInt:(int)n NS_DESIGNATED_INITIALIZER;
430 @implementation Derived
431 - (instancetype)initWithInt:(int)n
437 @interface ExtensionForMissingInterface() // expected-error{{cannot find interface declaration}}
438 - (instancetype)init NS_DESIGNATED_INITIALIZER;
441 @interface CategoryForMissingInterface(Cat) // expected-error{{cannot find interface declaration}}
442 - (instancetype)init NS_DESIGNATED_INITIALIZER; // expected-error{{only applies to init methods of interface or class extension declarations}}
447 __attribute__((objc_designated_initializer))
448 __attribute__((objc_method_family(init)));
450 __attribute__((objc_method_family(init)))
451 __attribute__((objc_designated_initializer));
453 __attribute__((objc_designated_initializer, objc_method_family(init)));
455 __attribute__((objc_method_family(init), objc_designated_initializer));