1 | // RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s |
2 | |
3 | @class FOO, BAR; // expected-note {{forward declaration of class here}} |
4 | @class FOO, BAR; |
5 | |
6 | @interface INTF : FOO // expected-error {{attempting to use the forward class 'FOO' as superclass of 'INTF'}} |
7 | @end |
8 | |
9 | @interface FOO |
10 | - (BAR*) Meth1; |
11 | - (FOO*) Meth2; |
12 | @end |
13 | |
14 | @interface INTF1 : FOO |
15 | @end |
16 | |
17 | @interface INTF2 : INTF1 // expected-note {{previous definition is here}} |
18 | @end |
19 | |
20 | |
21 | @class INTF1, INTF2; |
22 | |
23 | @interface INTF2 : INTF1 // expected-error {{duplicate interface definition for class 'INTF2'}} |
24 | @end |
25 | |
26 | // 2nd test of a forward class declaration matching a typedef name |
27 | // referring to class object. |
28 | // FIXME. This may become a negative test should we decide to make this an error. |
29 | // |
30 | @interface NSObject @end |
31 | |
32 | @protocol XCElementP @end |
33 | |
34 | typedef NSObject <XCElementP> XCElement; // expected-note {{previous definition is here}} |
35 | |
36 | @interface XCElementMainImp { |
37 | XCElement * _editingElement; |
38 | } |
39 | @end |
40 | |
41 | @class XCElement; // expected-warning {{redefinition of forward class 'XCElement' of a typedef name of an object type is ignored}} |
42 | |
43 | @implementation XCElementMainImp |
44 | - (XCElement *)editingElement { return _editingElement; } |
45 | @end |
46 | |
47 | |
48 | // rdar://9653341 |
49 | @class B; // expected-note {{forward declaration of class here}} |
50 | @interface A : B {} // expected-error {{attempting to use the forward class 'B' as superclass of 'A'}} |
51 | @end |
52 | |
53 | @interface B : A {} |
54 | @end |
55 | |
56 | @implementation A @end |
57 | @implementation B @end |
58 | |
59 | |