blob: 1f331508a89f79ce1bc10c20b572513ca72f672d [file] [log] [blame]
/* Test handling of the NSObject attribute. */
/* { dg-additional-options "-fsyntax-only " } */
/* { dg-additional-options "-Wno-objc-root-class" } */
typedef struct AnObj * __attribute__ ((NSObject)) AnObjRef;
typedef struct AnObj * __attribute__ ((__NSObject__)) AnotherObjRef;
/* We allow a void * to be labeled as NSObject. */
typedef void * __attribute__((NSObject)) AnonRef;
typedef struct AnObj * __attribute__((NSObject("foo"))) Bad; // { dg-error {wrong number of arguments specified for 'NSObject' attribute} }
typedef struct AnObj * __attribute__((NSObject(42))) Wrong; // { dg-error {wrong number of arguments specified for 'NSObject' attribute} }
/* Must be a pointer. */
typedef struct AnObj __attribute__((NSObject)) BadRef; // { dg-error {'NSObject' attribute is for pointer types only} }
typedef void * VPtr;
@interface CheckAttrNSObject
{
@public
AnObjRef aor;
/* TODO: synthesize without pre-defined ivars. */
VPtr obj_v;
int bar;
/* TODO: This should warn, even tho the property does not */
__attribute__((NSObject)) struct AnObj *Thing;
}
@property(copy) AnObjRef aor;
typedef struct AnObj * __attribute__((NSObject)) AnObjPtr3;
@property (nonatomic, retain) AnObjPtr3 obj_3;
@property (retain) __attribute__((NSObject)) VPtr obj_v;
//@property (strong, nullable) AnObjPtr3 objp_4;
@property(retain) __attribute__((NSObject)) int bar;
// { dg-error {'NSObject' attribute is for pointer types only} "" { target *-*-* } .-1 }
// { dg-error {'retain' attribute is only valid for Objective-C objects} "" { target *-*-* } .-2 }
@end
void foo ()
{
__attribute__((NSObject)) struct AnObj *AnotherThing; // { dg-warning {'NSObject' attribute may be put on a typedef only; attribute is ignored} }
}
void
setProperty(id self, id value)
{
((CheckAttrNSObject *)self)->aor = value;
}
id
getProperty(id self)
{
return (id)((CheckAttrNSObject *)self)->aor;
}
@implementation CheckAttrNSObject
@synthesize aor;
@dynamic obj_3;
@synthesize obj_v;
@synthesize bar; // { dg-warning {returning 'id' from a function with return type 'int'} }
@end // { dg-warning {passing argument} }