1/* Check if objc_super stack variables are created correctly (and 2 not clobbered by other values). */ 3/* Contributed by Ziemowit Laski <zlaski@apple.com>. */ 4/* { dg-options "-std=c99" } */ 5/* { dg-do run } */ 6/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */ 7 8#include "../objc-obj-c++-shared/TestsuiteObject.m" 9 10extern void abort(void); 11 12#define CHECK_IF(expr) if(!(expr)) abort(); 13 14typedef struct _Point { 15 float x; 16 float y; 17} Point; 18 19Point MakePoint ( float x , float y ) { 20 Point p; 21 p.x = x; 22 p.y = y; 23 return p; 24} 25 26@interface Base: TestsuiteObject 27- ( void ) translateOriginToPoint : ( Point ) translation ; 28@end 29 30@interface Derived : Base 31- ( void ) scrollToPoint : ( Point ) newOrigin ; 32- ( void ) translateOriginToPoint : ( Point ) translation ; 33@end 34 35int blort; 36float result; 37 38@implementation Base 39- ( void ) translateOriginToPoint : ( Point ) translation { 40 result = translation.x + translation.y; 41} 42@end 43 44@implementation Derived 45- ( void ) scrollToPoint : ( Point ) newOrigin { 46 float transDeltaX =newOrigin.x, transDeltaY =newOrigin.y ; 47 Point w; 48 if ( ! blort ) { 49 w.x = transDeltaX ; w.y = transDeltaY ; 50 [ super translateOriginToPoint : w ] ; 51 return; 52 } 53 [ super translateOriginToPoint : MakePoint ( transDeltaX , transDeltaY ) ] ; 54 return; 55} 56- (void) translateOriginToPoint : ( Point ) translation { 57 /* This should never be called. */ 58 CHECK_IF(0); 59} 60@end 61 62int main(void) { 63 Derived *v = [Derived new]; 64 float r0 = 1.5 + 1.5; 65 blort = 1; 66 [v scrollToPoint: MakePoint(1.5, 1.5)]; 67 CHECK_IF(result == r0); 68 blort = 0; 69 [v scrollToPoint: MakePoint(1.5, 1.5)]; 70 CHECK_IF(result == r0); 71 blort = 1; 72 [v scrollToPoint: MakePoint(1.5, 1.5)]; 73 CHECK_IF(result == r0); 74 [v free]; 75 return 0; 76} 77 78 79