/* APPLE LOCAL file 4653319 */ /* Test for several property corner cases; 1) not having ivar in the @interface, but specifying ivar=name in the @implementation is legal. 2) 'ivar' can be inherited from base. 3) super.string is how you access an inherited property from within a property accessor method. */ /* APPLE LOCAL radar 4899595 */ /* { dg-options "-fno-objc-new-property -mmacosx-version-min=10.5" { target powerpc*-*-darwin* i?86*-*-darwin* } } */ /* { dg-options "-fno-objc-new-property" { target arm*-*-darwin* } } */ /* { dg-do run { target *-*-darwin* } } */ // define a protocol consisting of 3 properties, object, number, and string. @protocol P @property id object; @property int number; @property char *string; @end // define a base class that contains a fully synthesized implementation of the string property. // this is inherited by all other implementations @interface Base { @protected Class isa; id _object; int _number; } @property(readonly) Class MyClass; @property(ivar) char *string; // fully synthesized property string. @end @implementation Base @property(readonly, ivar=isa) Class MyClass; @end // Test 1: Implement protocol P using synthesized properties by wrapping inherited instance variables. @interface A : Base <P> // <P> is satisfied by inheriting string from Base, and implementing object and number. @property id object; // unspecified implementation of property object in interface. @property(ivar=_number) int number; // partially synthesized property number using inherited ivar _number. @end @implementation A @property(ivar=_object) id object; // partially synthesized property number using inherited ivar _object. @end /* { dg-warning "no synthesized or user getter" } */ /* { dg-warning "no synthesized or user setter" "" { target *-*-* } 45 } */ @interface B : Base { } @end // Test 2: implement protocol P with a category. @implementation B @end @interface B (Properties) <P> @property id object; // unspecified implementation of property object in interface. @property(ivar=_number) int number; // partially synthesized property number using inherited ivar _number. @end @implementation B (Properties) @property(ivar=_object) id object; // partially synthesized property number using inherited ivar _object. @end // Test 3: implement protocol P with explicit accessor methods. @interface C : Base <P> @property id object; @property int number; @end @implementation C - (id)_getObject { return _object; } - (void)_setObject:(id)value { _object = value; } - (int)gEt_NuMbEr { return _number; } - (void)SeT_nUmBeR:(int)value { _number = value; } - (char *)string { return super.string; }; - (void)setString:(char *)value { super.string = value; } @property(getter=_getObject, setter=_setObject:) id object; @property(getter=gEt_NuMbEr, setter=SeT_nUmBeR:) int number; @end // Test 4: Warn when no accessor is syntesized. @interface Foo { Class isa; } @property id bar; @end @implementation Foo @end /* { dg-warning "no synthesized or user getter" } */ /* { dg-warning "no synthesized or user setter" "" { target *-*-* } 97 } */ int main(int argc, char **argv) { return 0; }