|  | // RUN: %clang_cc1 -emit-llvm -o %t %s | 
|  |  | 
|  | int printf(const char *, ...); | 
|  |  | 
|  | @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; | 
|  | } | 
|  |  |