1 | // RUN: %clang_cc1 -emit-llvm -o %t %s |
2 | |
3 | int printf(const char *, ...); |
4 | |
5 | @interface Root |
6 | -(id) alloc; |
7 | -(id) init; |
8 | @end |
9 | |
10 | // Property above methods... |
11 | |
12 | @interface Top0 : Root |
13 | @property(getter=_getX,setter=_setX:) int x; |
14 | @end |
15 | |
16 | @interface Bot0 : Top0 |
17 | -(int) x; |
18 | -(void) setX: (int) arg; |
19 | @end |
20 | |
21 | @implementation Top0 |
22 | -(int) _getX { |
23 | printf("-[ Top0 _getX ]\n"); |
24 | return 0; |
25 | } |
26 | -(void) _setX: (int) arg { |
27 | printf("-[ Top0 _setX: %d ]\n", arg); |
28 | } |
29 | @end |
30 | |
31 | @implementation Bot0 |
32 | -(int) x { |
33 | printf("-[ Bot0 _getX ]\n"); |
34 | return 0; |
35 | } |
36 | -(void) setX: (int) arg { |
37 | printf("-[ Bot0 _setX: %d ]\n", arg); |
38 | } |
39 | @end |
40 | |
41 | // Methods above property... |
42 | |
43 | @interface Top1 : Root |
44 | -(int) x; |
45 | -(void) setX: (int) arg; |
46 | @end |
47 | |
48 | @interface Bot1 : Top1 |
49 | @property(getter=_getX,setter=_setX:) int x; |
50 | @end |
51 | |
52 | @implementation Top1 |
53 | -(int) x { |
54 | printf("-[ Top1 x ]\n"); |
55 | return 0; |
56 | } |
57 | -(void) setX: (int) arg { |
58 | printf("-[ Top1 setX: %d ]\n", arg); |
59 | } |
60 | @end |
61 | |
62 | @implementation Bot1 |
63 | -(int) _getX { |
64 | printf("-[ Bot1 _getX ]\n"); |
65 | return 0; |
66 | } |
67 | -(void) _setX: (int) arg { |
68 | printf("-[ Bot1 _setX: %d ]\n", arg); |
69 | } |
70 | @end |
71 | |
72 | // Mixed setter & getter (variant 1) |
73 | |
74 | @interface Top2 : Root |
75 | -(int) x; |
76 | -(void) _setX: (int) arg; |
77 | @end |
78 | |
79 | @interface Bot2 : Top2 |
80 | @property(getter=_getX,setter=_setX:) int x; |
81 | @end |
82 | |
83 | @implementation Top2 |
84 | -(int) x { |
85 | printf("-[ Top2 x ]\n"); |
86 | return 0; |
87 | } |
88 | -(void) _setX: (int) arg { |
89 | printf("-[ Top2 _setX: %d ]\n", arg); |
90 | } |
91 | @end |
92 | |
93 | @implementation Bot2 |
94 | -(int) _getX { |
95 | printf("-[ Bot2 _getX ]\n"); |
96 | return 0; |
97 | } |
98 | -(void) setX: (int) arg { |
99 | printf("-[ Bot2 setX: %d ]\n", arg); |
100 | } |
101 | @end |
102 | |
103 | // Mixed setter & getter (variant 2) |
104 | |
105 | @interface Top3 : Root |
106 | -(int) _getX; |
107 | -(void) setX: (int) arg; |
108 | @end |
109 | |
110 | @interface Bot3 : Top3 |
111 | @property(getter=_getX,setter=_setX:) int x; |
112 | @end |
113 | |
114 | @implementation Top3 |
115 | -(int) _getX { |
116 | printf("-[ Top3 _getX ]\n"); |
117 | return 0; |
118 | } |
119 | -(void) setX: (int) arg { |
120 | printf("-[ Top3 setX: %d ]\n", arg); |
121 | } |
122 | @end |
123 | |
124 | @implementation Bot3 |
125 | -(int) x { |
126 | printf("-[ Bot3 x ]\n"); |
127 | return 0; |
128 | } |
129 | -(void) _setX: (int) arg { |
130 | printf("-[ Bot3 _setX: %d ]\n", arg); |
131 | } |
132 | @end |
133 | |
134 | // Mixed setter & getter (variant 3) |
135 | |
136 | @interface Top4 : Root |
137 | @property(getter=_getX,setter=_setX:) int x; |
138 | @end |
139 | |
140 | @interface Bot4 : Top4 |
141 | -(int) _getX; |
142 | -(void) setX: (int) arg; |
143 | @end |
144 | |
145 | @implementation Top4 |
146 | -(int) x { |
147 | printf("-[ Top4 x ]\n"); |
148 | return 0; |
149 | } |
150 | -(void) _setX: (int) arg { |
151 | printf("-[ Top4 _setX: %d ]\n", arg); |
152 | } |
153 | @end |
154 | |
155 | @implementation Bot4 |
156 | -(int) _getX { |
157 | printf("-[ Bot4 _getX ]\n"); |
158 | return 0; |
159 | } |
160 | -(void) setX: (int) arg { |
161 | printf("-[ Bot4 setX: %d ]\n", arg); |
162 | } |
163 | @end |
164 | |
165 | // Mixed setter & getter (variant 4) |
166 | |
167 | @interface Top5 : Root |
168 | @property(getter=_getX,setter=_setX:) int x; |
169 | @end |
170 | |
171 | @interface Bot5 : Top5 |
172 | -(int) x; |
173 | -(void) _setX: (int) arg; |
174 | @end |
175 | |
176 | @implementation Top5 |
177 | -(int) _getX { |
178 | printf("-[ Top5 _getX ]\n"); |
179 | return 0; |
180 | } |
181 | -(void) setX: (int) arg { |
182 | printf("-[ Top5 setX: %d ]\n", arg); |
183 | } |
184 | @end |
185 | |
186 | @implementation Bot5 |
187 | -(int) x { |
188 | printf("-[ Bot5 x ]\n"); |
189 | return 0; |
190 | } |
191 | -(void) _setX: (int) arg { |
192 | printf("-[ Bot5 _setX: %d ]\n", arg); |
193 | } |
194 | @end |
195 | |
196 | // Mixed level calls (variant 1) |
197 | |
198 | @interface Top6 : Root |
199 | -(int) x; |
200 | @end |
201 | |
202 | @interface Bot6 : Top6 |
203 | -(void) setX: (int) arg; |
204 | @end |
205 | |
206 | @implementation Top6 |
207 | -(int) x { |
208 | printf("-[ Top6 x ]\n"); |
209 | return 0; |
210 | } |
211 | @end |
212 | |
213 | @implementation Bot6 |
214 | -(void) setX: (int) arg { |
215 | printf("-[ Bot5 setX: %d ]\n", arg); |
216 | } |
217 | @end |
218 | |
219 | // Mixed level calls (variant 1) |
220 | |
221 | @interface Top7 : Root |
222 | -(void) setX: (int) arg; |
223 | @end |
224 | |
225 | @interface Bot7 : Top7 |
226 | -(int) x; |
227 | @end |
228 | |
229 | @implementation Top7 |
230 | -(void) setX: (int) arg { |
231 | printf("-[ Top7 setX: %d ]\n", arg); |
232 | } |
233 | @end |
234 | |
235 | @implementation Bot7 |
236 | -(int) x { |
237 | printf("-[ Bot7 x ]\n"); |
238 | return 0; |
239 | } |
240 | @end |
241 | |
242 | // |
243 | |
244 | // FIXME: Two more (thats it?) interesting cases. Method access on |
245 | // getter w/o setter and method access on setter w/o getter. |
246 | |
247 | int main() { |
248 | #define test(N) { \ |
249 | Bot##N *ob = [[Bot##N alloc] init]; \ |
250 | int x = ob.x; \ |
251 | ob.x = 10; } |
252 | |
253 | test(0); |
254 | test(1); |
255 | test(2); |
256 | test(3); |
257 | test(4); |
258 | test(5); |
259 | // test(6); |
260 | // test(7); |
261 | |
262 | return 0; |
263 | } |
264 | |
265 | |