1// RUN: %clang_cc1 -fsyntax-only -verify -Wselector-type-mismatch %s
2
3__attribute__((objc_root_class))
4@interface Inteface_Implementation
5@property(nonatomic, readonly) int normal_normal;
6@property(nonatomic, readonly, direct) int direct_normal;
7@property(nonatomic, readonly) int normal_direct; // expected-note {{previous declaration is here}}
8@property(nonatomic, readonly, direct) int direct_direct;
9@end
10
11@implementation Inteface_Implementation
12- (int)normal_normal {
13  return 42;
14}
15- (int)direct_normal {
16  return 42;
17}
18- (int)normal_direct __attribute__((objc_direct)) { // expected-error {{direct method implementation was previously declared not direct}}
19  return 42;
20}
21- (int)direct_direct __attribute__((objc_direct)) {
22  return 42;
23}
24@end
25
26__attribute__((objc_root_class))
27@interface Inteface_Extension
28@property(nonatomic, readonly) int normal_normal;
29@property(nonatomic, readonly, direct) int direct_normal;
30@property(nonatomic, readonly) int normal_direct;
31@property(nonatomic, readonly, direct) int direct_direct;
32@end
33
34@interface Inteface_Extension ()
35@property(nonatomic, readwrite) int normal_normal;
36@property(nonatomic, readwrite) int direct_normal;
37@property(nonatomic, readwrite, direct) int normal_direct;
38@property(nonatomic, readwrite, direct) int direct_direct;
39@end
40
41@implementation Inteface_Extension
42@end
43
44__attribute__((objc_root_class))
45@interface Extension_Implementation
46@end
47
48@interface Extension_Implementation ()
49@property(nonatomic, readwrite) int normal_normal;
50@property(nonatomic, readwrite, direct) int direct_normal;
51@property(nonatomic, readwrite) int normal_direct; // expected-note {{previous declaration is here}}
52@property(nonatomic, readwrite, direct) int direct_direct;
53@end
54
55@implementation Extension_Implementation
56- (int)normal_normal {
57  return 42;
58}
59- (int)direct_normal {
60  return 42;
61}
62- (int)normal_direct __attribute__((objc_direct)) { // expected-error {{direct method implementation was previously declared not direct}}
63  return 42;
64}
65- (int)direct_direct __attribute__((objc_direct)) {
66  return 42;
67}
68@end
69
70__attribute__((objc_root_class))
71@interface Inteface_Category
72@property(nonatomic, readonly) int normal_normal;
73@property(nonatomic, readonly, direct) int direct_normal; // expected-note {{previous declaration is here}}
74@property(nonatomic, readonly) int normal_direct;         // expected-note {{previous declaration is here}}
75@property(nonatomic, readonly, direct) int direct_direct; // expected-note {{previous declaration is here}}
76@end
77
78@interface Inteface_Category (SomeCategory)
79@property(nonatomic, readonly) int normal_normal;
80@property(nonatomic, readonly) int direct_normal;         // expected-error {{property declaration conflicts with previous direct declaration of property 'direct_normal'}}
81@property(nonatomic, readonly, direct) int normal_direct; // expected-error {{direct property declaration conflicts with previous declaration of property 'normal_direct'}}
82@property(nonatomic, readonly, direct) int direct_direct; // expected-error {{direct property declaration conflicts with previous direct declaration of property 'direct_direct'}}
83@end
84
85@implementation Inteface_Category
86@end
87
88__attribute__((objc_root_class))
89@interface Extension_Category
90@end
91
92@interface Extension_Category ()
93@property(nonatomic, readonly) int normal_normal;
94@property(nonatomic, readonly, direct) int direct_normal; // expected-note {{previous declaration is here}}
95@property(nonatomic, readonly) int normal_direct;         // expected-note {{previous declaration is here}}
96@property(nonatomic, readonly, direct) int direct_direct; // expected-note {{previous declaration is here}}
97@end
98
99@interface Extension_Category (SomeCategory)
100@property(nonatomic, readonly) int normal_normal;
101@property(nonatomic, readonly) int direct_normal;         // expected-error {{property declaration conflicts with previous direct declaration of property 'direct_normal'}}
102@property(nonatomic, readonly, direct) int normal_direct; // expected-error {{direct property declaration conflicts with previous declaration of property 'normal_direct'}}
103@property(nonatomic, readonly, direct) int direct_direct; // expected-error {{direct property declaration conflicts with previous direct declaration of property 'direct_direct'}}
104@end
105
106@implementation Extension_Category
107@end
108
109__attribute__((objc_root_class))
110@interface Implementation_Category
111@end
112
113@interface Implementation_Category (SomeCategory)
114@property(nonatomic, readonly) int normal_normal;
115@property(nonatomic, readonly, direct) int direct_normal; // expected-note {{previous declaration is here}}
116@property(nonatomic, readonly) int normal_direct;         // expected-note {{previous declaration is here}}
117@property(nonatomic, readonly, direct) int direct_direct; // expected-note {{previous declaration is here}}
118@end
119
120@implementation Implementation_Category
121- (int)normal_normal {
122  return 42;
123}
124- (int)direct_normal { // expected-error {{direct method was declared in a category but is implemented in the primary interface}}
125  return 42;
126}
127- (int)normal_direct __attribute__((objc_direct)) { // expected-error {{direct method was declared in a category but is implemented in the primary interface}}
128  return 42;
129}
130- (int)direct_direct __attribute__((objc_direct)) { // expected-error {{direct method was declared in a category but is implemented in the primary interface}}
131  return 42;
132}
133@end
134
135__attribute__((objc_root_class))
136@interface Category_Category
137@end
138
139@interface Category_Category (SomeCategory)
140@property(nonatomic, readonly) int normal_normal;
141@property(nonatomic, readonly, direct) int direct_normal; // expected-note {{previous declaration is here}}
142@property(nonatomic, readonly) int normal_direct;         // expected-note {{previous declaration is here}}
143@property(nonatomic, readonly, direct) int direct_direct; // expected-note {{previous declaration is here}}
144@end
145
146@interface Category_Category (SomeOtherCategory)
147@property(nonatomic, readonly) int normal_normal;
148@property(nonatomic, readonly) int direct_normal;         // expected-error {{property declaration conflicts with previous direct declaration of property 'direct_normal'}}
149@property(nonatomic, readonly, direct) int normal_direct; // expected-error {{direct property declaration conflicts with previous declaration of property 'normal_direct'}}
150@property(nonatomic, readonly, direct) int direct_direct; // expected-error {{direct property declaration conflicts with previous direct declaration of property 'direct_direct'}}
151@end
152
153@implementation Category_Category
154@end
155
156__attribute__((objc_root_class))
157@interface Category_CategoryImplementation
158@end
159
160@interface Category_CategoryImplementation (SomeCategory)
161@property(nonatomic, readonly) int normal_normal;
162@property(nonatomic, readonly, direct) int direct_normal;
163@property(nonatomic, readonly) int normal_direct; // expected-note {{previous declaration is here}}
164@property(nonatomic, readonly, direct) int direct_direct;
165@end
166
167@implementation Category_CategoryImplementation (SomeCategory)
168- (int)normal_normal {
169  return 42;
170}
171- (int)direct_normal {
172  return 42;
173}
174- (int)normal_direct __attribute__((objc_direct)) { // expected-error {{direct method implementation was previously declared not direct}}
175  return 42;
176}
177- (int)direct_direct __attribute__((objc_direct)) {
178  return 42;
179}
180@end
181
182@implementation Category_CategoryImplementation
183@end
184
185__attribute__((objc_root_class))
186@interface Interface_CategoryImplementation
187@property(nonatomic, readonly) int normal_normal;
188@property(nonatomic, readonly, direct) int direct_normal; // expected-note {{previous declaration is here}}
189@property(nonatomic, readonly) int normal_direct;         // expected-note {{previous declaration is here}}
190@property(nonatomic, readonly, direct) int direct_direct; // expected-note {{previous declaration is here}}
191@end
192
193@interface Interface_CategoryImplementation (SomeCategory)
194@end
195
196@implementation Interface_CategoryImplementation (SomeCategory)
197- (int)normal_normal {
198  return 42;
199}
200- (int)direct_normal { // expected-error {{direct method was declared in the primary interface but is implemented in a category}}
201  return 42;
202}
203- (int)normal_direct __attribute__((objc_direct)) { // expected-error {{direct method was declared in the primary interface but is implemented in a category}}
204  return 42;
205}
206- (int)direct_direct __attribute__((objc_direct)) { // expected-error {{direct method was declared in the primary interface but is implemented in a category}}
207  return 42;
208}
209@end
210
211@implementation Interface_CategoryImplementation
212@end
213
214__attribute__((objc_root_class))
215@interface Extension_CategoryImplementation
216@end
217
218@interface Extension_CategoryImplementation ()
219@property(nonatomic, readonly) int normal_normal;
220@property(nonatomic, readonly, direct) int direct_normal; // expected-note {{previous declaration is here}}
221@property(nonatomic, readonly) int normal_direct;         // expected-note {{previous declaration is here}}
222@property(nonatomic, readonly, direct) int direct_direct; // expected-note {{previous declaration is here}}
223@end
224
225@interface Extension_CategoryImplementation (SomeCategory)
226@end
227
228@implementation Extension_CategoryImplementation (SomeCategory)
229- (int)normal_normal {
230  return 42;
231}
232- (int)direct_normal { // expected-error {{direct method was declared in an extension but is implemented in a different category}}
233  return 42;
234}
235- (int)normal_direct __attribute__((objc_direct)) { // expected-error {{direct method was declared in an extension but is implemented in a different category}}
236  return 42;
237}
238- (int)direct_direct __attribute__((objc_direct)) { // expected-error {{direct method was declared in an extension but is implemented in a different category}}
239  return 42;
240}
241@end
242
243__attribute__((objc_root_class))
244@interface OtherCategory_CategoryImplementation
245@end
246
247@interface OtherCategory_CategoryImplementation (SomeCategory)
248@end
249
250@interface OtherCategory_CategoryImplementation (SomeOtherCategory)
251@property(nonatomic, readonly) int normal_normal;
252@property(nonatomic, readonly, direct) int direct_normal; // expected-note {{previous declaration is here}}
253@property(nonatomic, readonly) int normal_direct;         // expected-note {{previous declaration is here}}
254@property(nonatomic, readonly, direct) int direct_direct; // expected-note {{previous declaration is here}}
255@end
256
257@implementation OtherCategory_CategoryImplementation (SomeCategory)
258- (int)normal_normal {
259  return 42;
260}
261- (int)direct_normal { // expected-error {{direct method was declared in a category but is implemented in a different category}}
262  return 42;
263}
264- (int)normal_direct __attribute__((objc_direct)) { // expected-error {{direct method was declared in a category but is implemented in a different category}}
265  return 42;
266}
267- (int)direct_direct __attribute__((objc_direct)) { // expected-error {{direct method was declared in a category but is implemented in a different category}}
268  return 42;
269}
270@end
271
272@implementation OtherCategory_CategoryImplementation
273@end
274