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