1/* See if -forward::/-performv:: is able to work. */
2
3#include <stdio.h>
4#include <stdlib.h>
5
6#import "../../objc-obj-c++-shared/Object1.h"
7#import "../../objc-obj-c++-shared/next-mapping.h"
8#include <objc/objc-api.h>
9
10#define VALUETOUSE 1234567890
11
12id forwarder, receiver;
13
14@interface Forwarder: Object
15{
16    id receiver;
17}
18
19-initWithReceiver:theReceiver;
20
21@end
22
23@interface Receiver:Object
24{
25    int foo;
26}
27-display;
28-initWithFoo:(int)theFoo;
29@end
30@implementation Receiver
31
32-initWithFoo: (int)theFoo
33{
34    foo = theFoo;
35    return self;
36}
37
38-display
39{
40    /* Check to see if we are really the reciever. */
41    if (self != receiver)
42        abort ();
43    /* And the value of foo is set correctly. */
44    if (foo != VALUETOUSE)
45      abort ();
46    return self;
47}
48
49@end
50
51@implementation Forwarder
52-initWithReceiver: theReceiver
53{
54    [super init];
55    receiver = theReceiver;
56    return self;
57}
58#ifdef __NEXT_RUNTIME__
59- forward: (SEL)theSel: (marg_list)theArgFrame
60#else
61-(retval_t) forward: (SEL)theSel: (arglist_t)theArgFrame
62#endif
63{
64  /* If we have a reciever try to perform on that object */
65    if (receiver)
66        return [receiver performv: theSel: theArgFrame];
67    return [self doesNotRecognize:theSel];
68}
69@end
70int main()
71{
72    /* Init the reciever. */
73    receiver = [[Receiver alloc] initWithFoo: VALUETOUSE];
74    /* Init the fowarder. */
75    forwarder = [[Forwarder alloc] initWithReceiver: receiver];
76    /* Call display on the forwarder which in turns calls display on
77       the reciever. */
78    [forwarder display];
79    exit(0);
80}
81