/* Contributed by Nicola Pero , November 2010. */ /* { dg-do compile } */ /* Test that when using @synthesize with a readonly property, the instance variable can be a specialization of the property type. */ #include @protocol MyProtocol - (void)aMethod; @end @interface ClassA @end @interface ClassB : ClassA @end /* This is all OK. */ @interface Test { int v; float w; id x; Test *y; id *z; ClassA *a; ClassB *b; ClassA *c; } @property (assign, readonly) int v; @property (assign, readonly) float w; @property (assign, readonly) id x; @property (assign, readonly) Test *y; @property (assign, readonly) id *z; @property (assign, readonly) ClassA *a; @property (assign, readonly) ClassB *b; @end @implementation Test @synthesize v; @synthesize w; @synthesize x; @synthesize y; @synthesize z; @synthesize a; @synthesize b; @end /* This is sometimes OK, sometimes not OK. */ @interface Test2 { int v; /* { dg-message "originally specified here" } */ float w; /* { dg-message "originally specified here" } */ id x; /* { dg-message "originally specified here" } */ Test *y; id *z; /* { dg-message "originally specified here" } */ ClassA *a; /* { dg-message "originally specified here" } */ ClassB *b; } @property (assign, readonly) float v; @property (assign, readonly) id w; @property (assign, readonly) int x; @property (assign, readonly) id y; @property (assign, readonly) Test *z; @property (assign, readonly) ClassB *a; @property (assign, readonly) ClassA *b; @end @implementation Test2 @synthesize v; /* { dg-error "property .v. is using instance variable .v. of incompatible type" } */ @synthesize w; /* { dg-error "property .w. is using instance variable .w. of incompatible type" } */ @synthesize x; /* { dg-error "property .x. is using instance variable .x. of incompatible type" } */ @synthesize y; @synthesize z; /* { dg-error "property .z. is using instance variable .z. of incompatible type" } */ @synthesize a; /* { dg-error "property .a. is using instance variable .a. of incompatible type" } */ @synthesize b; @end