xref: /aosp_15_r20/external/clang/test/SemaObjC/attr-designated-init.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
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