diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/objc.dg/torture/forward-1.m | 46 |
1 files changed, 42 insertions, 4 deletions
diff --git a/gcc/testsuite/objc.dg/torture/forward-1.m b/gcc/testsuite/objc.dg/torture/forward-1.m index b45f1b4..a25012d 100644 --- a/gcc/testsuite/objc.dg/torture/forward-1.m +++ b/gcc/testsuite/objc.dg/torture/forward-1.m @@ -1,32 +1,53 @@ /* { dg-do run } */ /* See if -forward:: is able to work. */ /* { dg-skip-if "Needs OBJC2 Implementation" { *-*-darwin8* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */ - +/* { dg-additional-options "-Wl,-framework,Foundation" { target *-*-darwin* } } */ #include <stdio.h> #include <stdlib.h> +/* Versions of the runtime after 10.13 no longer support the original + 'forward:' mechanism, so we make a stripped down representation of + NSInvocation and need to link with -framework Foundation. */ +#if __NEXT_RUNTIME__ +@class NSInvocation, NSMethodSignature; +# include "../../objc-obj-c++-shared/F-NSObject.h" +@interface NSInvocation : NSObject ++ (NSInvocation *)invocationWithMethodSignature:(NSMethodSignature *)sig; +@property SEL selector; +- (void)invoke; +- (void)invokeWithTarget:(id)target; +@end +# define OBJECT NSObject +#else #include "../../objc-obj-c++-shared/TestsuiteObject.m" +#define OBJECT TestsuiteObject +#endif #define VALUETOUSE 1234567890 id forwarder, receiver; -@interface Forwarder: TestsuiteObject +@interface Forwarder : OBJECT { id receiver; } -initWithReceiver:theReceiver; +#if __NEXT_RUNTIME__ +- (void)forwardInvocation:(NSInvocation *)anInvocation; +- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector; +#endif @end -@interface Receiver:TestsuiteObject +@interface Receiver : OBJECT { int foo; } -display; -initWithFoo:(int)theFoo; @end + @implementation Receiver -initWithFoo: (int)theFoo @@ -56,7 +77,22 @@ id forwarder, receiver; receiver = theReceiver; return self; } --(void *) forward: (SEL)theSel: (void *)theArgFrame + +#if __NEXT_RUNTIME__ +- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSel +{ + return [receiver methodSignatureForSelector:aSel]; +} +- (void)forwardInvocation:(NSInvocation *)anInvocation +{ + if ([receiver respondsToSelector:[anInvocation selector]]) { + [anInvocation invokeWithTarget:receiver]; + } + else { + } +} +#else +-(void *) forward:(SEL)theSel : (void *)theArgFrame { /* If we have a reciever try to perform on that object */ if (receiver) @@ -75,6 +111,8 @@ id forwarder, receiver; printf ("Unrecognized selector\n"); return NULL; } +#endif + @end int main() { |