From b1b7599ca52f3ba94deea842c80286194d516210 Mon Sep 17 00:00:00 2001 From: Iain Sandoe Date: Tue, 6 Oct 2020 21:30:17 +0100 Subject: [PATCH] testsuite, Objective-C : Update forward-1.m. Newer versions of the runtime / NSObject don't respond to forward:. This uses the replacement. gcc/testsuite/ChangeLog: * objc.dg/torture/forward-1.m: Implement forwarding using the native NeXT (NSInvocation) method for Darwin. --- gcc/testsuite/objc.dg/torture/forward-1.m | 46 +++++++++++++++++++++-- 1 file 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 b45f1b444ed..a25012de25c 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 #include +/* 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() { -- 2.30.2