// 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; }