| /* APPLE LOCAL file radar 5802025 */ |
| /* This test case used to ICE because we did not generate a getter call from |
| OBJC_PROPERTY_REFERENCE_EXPR in time to access the property getter value when |
| getter is retuning a class. |
| */ |
| /* { dg-options "-mmacosx-version-min=10.5 -framework Foundation" { target powerpc*-*-darwin* i?86*-*-darwin* } } */ |
| /* { dg-options "-framework Foundation" { target arm*-*-darwin* } } */ |
| /* { dg-do run { target *-*-darwin* } } */ |
| |
| #import <Foundation/Foundation.h> |
| #import <objc/objc-runtime.h> |
| |
| class Vector3D |
| { |
| public: |
| float x, y, z; |
| |
| public: |
| Vector3D(); |
| Vector3D(const Vector3D &inVector); |
| Vector3D(float initX, float initY, float initZ); |
| Vector3D &operator=(const Vector3D & rhs); |
| |
| NSString *description(); |
| }; |
| |
| Vector3D::Vector3D() |
| { |
| x = y = z = 0; |
| } |
| |
| Vector3D::Vector3D(const Vector3D &inVector) |
| { |
| x = inVector.x; |
| y = inVector.y; |
| z = inVector.z; |
| } |
| |
| Vector3D::Vector3D(float initX, float initY, float initZ) |
| { |
| x = initX; |
| y = initY; |
| z = initZ; |
| } |
| |
| Vector3D &Vector3D::operator=(const Vector3D & rhs) |
| { |
| x = rhs.x; |
| y = rhs.y; |
| z = rhs.z; |
| |
| return *this; |
| } |
| |
| NSString *Vector3D::description() |
| { |
| return [NSString stringWithFormat: @"(%f, %f, %f)", x, y, z]; |
| } |
| |
| @interface Object3D : NSObject |
| { |
| Vector3D position; |
| } |
| |
| @property (assign, nonatomic) Vector3D position; |
| @end |
| |
| static int count; |
| |
| @implementation Object3D |
| |
| @synthesize position; |
| |
| - (id) init |
| { |
| self = [super init]; |
| if(self) |
| { |
| position = Vector3D(0, 0, 0); |
| } |
| |
| return self; |
| } |
| |
| - (void) setPosition: (Vector3D) inPosition |
| { |
| position = inPosition; |
| NSLog(@"setPosition was called with the vector %@", inPosition.description()); |
| ++count; |
| } |
| @end |
| |
| int main (int argc, const char * argv[]) |
| { |
| NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; |
| |
| Object3D *myObject = [[Object3D alloc] init]; |
| |
| // Each of these looks like it should call the setPosition method. However, |
| // if the Vector3D copy constructor is defined, this one won't. |
| // APPLE LOCAL begin radar 7591784 |
| // Workaround for bug in radar 7591784 |
| Vector3D V3D(1.0f, 1.0f, 1.0f); |
| myObject.position = V3D; |
| // APPLE LOCAL end radar 7591784 |
| NSLog(@"After assignment the position is: %@", myObject.position.description()); |
| |
| [myObject setPosition: Vector3D(2.0f, 2.0f, 2.0f)]; |
| NSLog(@"After setPosition: the position is: %@", myObject.position.description()); |
| |
| typedef void (*SetPositionIMP)(id self, SEL _cmd, Vector3D position); |
| ((SetPositionIMP)objc_msgSend)(myObject, @selector(setPosition:), Vector3D(3.0f, 3.0f, 3.0f)); |
| NSLog(@"After objc_msgSend the position is: %@", myObject.position.description()); |
| |
| [pool release]; |
| if (count != 3) |
| abort(); |
| return 0; |
| } |