| // RUN: clang-cc -fnext-runtime --emit-llvm -o %t %s |
| |
| #include <stdio.h> |
| |
| @interface Root |
| -(id) alloc; |
| -(id) init; |
| @end |
| |
| // Property above methods... |
| |
| @interface Top0 : Root |
| @property(getter=_getX,setter=_setX:) int x; |
| @end |
| |
| @interface Bot0 : Top0 |
| -(int) x; |
| -(void) setX: (int) arg; |
| @end |
| |
| @implementation Top0 |
| -(int) _getX { |
| printf("-[ Top0 _getX ]\n"); |
| return 0; |
| } |
| -(void) _setX: (int) arg { |
| printf("-[ Top0 _setX: %d ]\n", arg); |
| } |
| @end |
| |
| @implementation Bot0 |
| -(int) x { |
| printf("-[ Bot0 _getX ]\n"); |
| return 0; |
| } |
| -(void) setX: (int) arg { |
| printf("-[ Bot0 _setX: %d ]\n", arg); |
| } |
| @end |
| |
| // Methods above property... |
| |
| @interface Top1 : Root |
| -(int) x; |
| -(void) setX: (int) arg; |
| @end |
| |
| @interface Bot1 : Top1 |
| @property(getter=_getX,setter=_setX:) int x; |
| @end |
| |
| @implementation Top1 |
| -(int) x { |
| printf("-[ Top1 x ]\n"); |
| return 0; |
| } |
| -(void) setX: (int) arg { |
| printf("-[ Top1 setX: %d ]\n", arg); |
| } |
| @end |
| |
| @implementation Bot1 |
| -(int) _getX { |
| printf("-[ Bot1 _getX ]\n"); |
| return 0; |
| } |
| -(void) _setX: (int) arg { |
| printf("-[ Bot1 _setX: %d ]\n", arg); |
| } |
| @end |
| |
| // Mixed setter & getter (variant 1) |
| |
| @interface Top2 : Root |
| -(int) x; |
| -(void) _setX: (int) arg; |
| @end |
| |
| @interface Bot2 : Top2 |
| @property(getter=_getX,setter=_setX:) int x; |
| @end |
| |
| @implementation Top2 |
| -(int) x { |
| printf("-[ Top2 x ]\n"); |
| return 0; |
| } |
| -(void) _setX: (int) arg { |
| printf("-[ Top2 _setX: %d ]\n", arg); |
| } |
| @end |
| |
| @implementation Bot2 |
| -(int) _getX { |
| printf("-[ Bot2 _getX ]\n"); |
| return 0; |
| } |
| -(void) setX: (int) arg { |
| printf("-[ Bot2 setX: %d ]\n", arg); |
| } |
| @end |
| |
| // Mixed setter & getter (variant 2) |
| |
| @interface Top3 : Root |
| -(int) _getX; |
| -(void) setX: (int) arg; |
| @end |
| |
| @interface Bot3 : Top3 |
| @property(getter=_getX,setter=_setX:) int x; |
| @end |
| |
| @implementation Top3 |
| -(int) _getX { |
| printf("-[ Top3 _getX ]\n"); |
| return 0; |
| } |
| -(void) setX: (int) arg { |
| printf("-[ Top3 setX: %d ]\n", arg); |
| } |
| @end |
| |
| @implementation Bot3 |
| -(int) x { |
| printf("-[ Bot3 x ]\n"); |
| return 0; |
| } |
| -(void) _setX: (int) arg { |
| printf("-[ Bot3 _setX: %d ]\n", arg); |
| } |
| @end |
| |
| // Mixed setter & getter (variant 3) |
| |
| @interface Top4 : Root |
| @property(getter=_getX,setter=_setX:) int x; |
| @end |
| |
| @interface Bot4 : Top4 |
| -(int) _getX; |
| -(void) setX: (int) arg; |
| @end |
| |
| @implementation Top4 |
| -(int) x { |
| printf("-[ Top4 x ]\n"); |
| return 0; |
| } |
| -(void) _setX: (int) arg { |
| printf("-[ Top4 _setX: %d ]\n", arg); |
| } |
| @end |
| |
| @implementation Bot4 |
| -(int) _getX { |
| printf("-[ Bot4 _getX ]\n"); |
| return 0; |
| } |
| -(void) setX: (int) arg { |
| printf("-[ Bot4 setX: %d ]\n", arg); |
| } |
| @end |
| |
| // Mixed setter & getter (variant 4) |
| |
| @interface Top5 : Root |
| @property(getter=_getX,setter=_setX:) int x; |
| @end |
| |
| @interface Bot5 : Top5 |
| -(int) x; |
| -(void) _setX: (int) arg; |
| @end |
| |
| @implementation Top5 |
| -(int) _getX { |
| printf("-[ Top5 _getX ]\n"); |
| return 0; |
| } |
| -(void) setX: (int) arg { |
| printf("-[ Top5 setX: %d ]\n", arg); |
| } |
| @end |
| |
| @implementation Bot5 |
| -(int) x { |
| printf("-[ Bot5 x ]\n"); |
| return 0; |
| } |
| -(void) _setX: (int) arg { |
| printf("-[ Bot5 _setX: %d ]\n", arg); |
| } |
| @end |
| |
| // Mixed level calls (variant 1) |
| |
| @interface Top6 : Root |
| -(int) x; |
| @end |
| |
| @interface Bot6 : Top6 |
| -(void) setX: (int) arg; |
| @end |
| |
| @implementation Top6 |
| -(int) x { |
| printf("-[ Top6 x ]\n"); |
| return 0; |
| } |
| @end |
| |
| @implementation Bot6 |
| -(void) setX: (int) arg { |
| printf("-[ Bot5 setX: %d ]\n", arg); |
| } |
| @end |
| |
| // Mixed level calls (variant 1) |
| |
| @interface Top7 : Root |
| -(void) setX: (int) arg; |
| @end |
| |
| @interface Bot7 : Top7 |
| -(int) x; |
| @end |
| |
| @implementation Top7 |
| -(void) setX: (int) arg { |
| printf("-[ Top7 setX: %d ]\n", arg); |
| } |
| @end |
| |
| @implementation Bot7 |
| -(int) x { |
| printf("-[ Bot7 x ]\n"); |
| return 0; |
| } |
| @end |
| |
| // |
| |
| // FIXME: Two more (thats it?) interesting cases. Method access on |
| // getter w/o setter and method access on setter w/o getter. |
| |
| int main() { |
| #define test(N) { \ |
| Bot##N *ob = [[Bot##N alloc] init]; \ |
| int x = ob.x; \ |
| ob.x = 10; } |
| |
| test(0); |
| test(1); |
| test(2); |
| test(3); |
| test(4); |
| test(5); |
| // test(6); |
| // test(7); |
| |
| return 0; |
| } |
| |