265 lines
3.8 KiB
Mathematica
265 lines
3.8 KiB
Mathematica
|
// 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;
|
||
|
}
|
||
|
|