blob: 19e0d4900dde66cda06388059106dce0654a0705 [file] [log] [blame]
/* Check if objc_super stack variables are created correctly (and
not clobbered by other values). */
/* Contributed by Ziemowit Laski <zlaski@apple.com>. */
/* { dg-options "-std=c99 -lobjc" } */
/* { dg-do run } */
#include <objc/objc.h>
#include <objc/Object.h>
extern void abort(void);
#define CHECK_IF(expr) if(!(expr)) abort();
typedef struct _Point {
float x;
float y;
} Point;
Point MakePoint ( float x , float y ) {
Point p;
p.x = x;
p.y = y;
return p;
}
@interface Base: Object
- ( void ) translateOriginToPoint : ( Point ) translation ;
@end
@interface Derived : Base
- ( void ) scrollToPoint : ( Point ) newOrigin ;
- ( void ) translateOriginToPoint : ( Point ) translation ;
@end
int blort;
float result;
@implementation Base
- ( void ) translateOriginToPoint : ( Point ) translation {
result = translation.x + translation.y;
}
@end
@implementation Derived
- ( void ) scrollToPoint : ( Point ) newOrigin {
float transDeltaX =newOrigin.x, transDeltaY =newOrigin.y ;
Point w;
if ( ! blort ) {
w.x = transDeltaX ; w.y = transDeltaY ;
[ super translateOriginToPoint : w ] ;
return;
}
[ super translateOriginToPoint : MakePoint ( transDeltaX , transDeltaY ) ] ;
return;
}
- (void) translateOriginToPoint : ( Point ) translation {
/* This should never be called. */
CHECK_IF(0);
}
@end
int main(void) {
Derived *v = [Derived new];
float r0 = 1.5 + 1.5;
blort = 1;
[v scrollToPoint: MakePoint(1.5, 1.5)];
CHECK_IF(result == r0);
blort = 0;
[v scrollToPoint: MakePoint(1.5, 1.5)];
CHECK_IF(result == r0);
blort = 1;
[v scrollToPoint: MakePoint(1.5, 1.5)];
CHECK_IF(result == r0);
[v free];
return 0;
}