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