| /* 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} } |