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