[InstCombine] Preserve NSW flags for `lshr (mul nuw X, C1), C2 -> mul nuw nsw X,...
[llvm-project.git] / clang / test / SemaObjC / category-direct-properties.m
blob7a0873436bfbcadba9d4ccbe5a91051b7b54196f
1 // RUN: %clang_cc1 -fsyntax-only -verify -Wselector-type-mismatch %s
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
11 @implementation Inteface_Implementation
12 - (int)normal_normal {
13   return 42;
15 - (int)direct_normal {
16   return 42;
18 - (int)normal_direct __attribute__((objc_direct)) { // expected-error {{direct method implementation was previously declared not direct}}
19   return 42;
21 - (int)direct_direct __attribute__((objc_direct)) {
22   return 42;
24 @end
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
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
41 @implementation Inteface_Extension
42 @end
44 __attribute__((objc_root_class))
45 @interface Extension_Implementation
46 @end
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
55 @implementation Extension_Implementation
56 - (int)normal_normal {
57   return 42;
59 - (int)direct_normal {
60   return 42;
62 - (int)normal_direct __attribute__((objc_direct)) { // expected-error {{direct method implementation was previously declared not direct}}
63   return 42;
65 - (int)direct_direct __attribute__((objc_direct)) {
66   return 42;
68 @end
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
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
85 @implementation Inteface_Category
86 @end
88 __attribute__((objc_root_class))
89 @interface Extension_Category
90 @end
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
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
106 @implementation Extension_Category
107 @end
109 __attribute__((objc_root_class))
110 @interface Implementation_Category
111 @end
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
120 @implementation Implementation_Category
121 - (int)normal_normal {
122   return 42;
124 - (int)direct_normal { // expected-error {{direct method was declared in a category but is implemented in the primary interface}}
125   return 42;
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;
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;
133 @end
135 __attribute__((objc_root_class))
136 @interface Category_Category
137 @end
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
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
153 @implementation Category_Category
154 @end
156 __attribute__((objc_root_class))
157 @interface Category_CategoryImplementation
158 @end
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
167 @implementation Category_CategoryImplementation (SomeCategory)
168 - (int)normal_normal {
169   return 42;
171 - (int)direct_normal {
172   return 42;
174 - (int)normal_direct __attribute__((objc_direct)) { // expected-error {{direct method implementation was previously declared not direct}}
175   return 42;
177 - (int)direct_direct __attribute__((objc_direct)) {
178   return 42;
180 @end
182 @implementation Category_CategoryImplementation
183 @end
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
193 @interface Interface_CategoryImplementation (SomeCategory)
194 @end
196 @implementation Interface_CategoryImplementation (SomeCategory)
197 - (int)normal_normal {
198   return 42;
200 - (int)direct_normal { // expected-error {{direct method was declared in the primary interface but is implemented in a category}}
201   return 42;
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;
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;
209 @end
211 @implementation Interface_CategoryImplementation
212 @end
214 __attribute__((objc_root_class))
215 @interface Extension_CategoryImplementation
216 @end
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
225 @interface Extension_CategoryImplementation (SomeCategory)
226 @end
228 @implementation Extension_CategoryImplementation (SomeCategory)
229 - (int)normal_normal {
230   return 42;
232 - (int)direct_normal { // expected-error {{direct method was declared in an extension but is implemented in a different category}}
233   return 42;
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;
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;
241 @end
243 __attribute__((objc_root_class))
244 @interface OtherCategory_CategoryImplementation
245 @end
247 @interface OtherCategory_CategoryImplementation (SomeCategory)
248 @end
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
257 @implementation OtherCategory_CategoryImplementation (SomeCategory)
258 - (int)normal_normal {
259   return 42;
261 - (int)direct_normal { // expected-error {{direct method was declared in a category but is implemented in a different category}}
262   return 42;
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;
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;
270 @end
272 @implementation OtherCategory_CategoryImplementation
273 @end