blob: 0f1cca4fd9e60b8951b22ef0604648e7dd6b012f [file] [log] [blame]
/* 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" } */
/* { 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 *-*-* } 44 } */
@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 *-*-* } 96 } */
int main(int argc, char **argv) {
return 0;
}