| /* APPLE LOCAL file radar 5811191 */ |
| /* Test that all 'ivars' are treated as implicit byref. Its inclusing inside |...| |
| block is treated with a warning and ignored. |
| */ |
| /* { dg-do run { target *-*-darwin[1-2][0-9]* } } */ |
| /* { dg-options "-ObjC++ -mmacosx-version-min=10.5 -fobjc-gc -framework Foundation" { target *-*-darwin* } } */ |
| /* { dg-skip-if "" { powerpc*-*-darwin* } { "-m64" } { "" } } */ |
| |
| #import <Foundation/Foundation.h> |
| |
| void * _NSConcreteStackBlock; |
| |
| enum { |
| BLOCK_NEEDS_FREE = (1 << 24), |
| BLOCK_HAS_COPY_DISPOSE = (1 << 25), |
| BLOCK_NO_COPY = (1 << 26), // interim byref: no copies allowed |
| BLOCK_IS_GC = (1 << 27), |
| }; |
| |
| struct Block_basic { |
| void *isa; |
| //char flags; char size; short refcount; |
| int Block_flags; // int32_t |
| int Block_size; // XXX should be packed into Block_flags |
| void (*Block_invoke)(void *); |
| void (*Block_copy)(void *dst, void *src); |
| void (*Block_dispose)(void *); |
| //long params[0]; // generic space for const & byref hidden params, return value, variable on needs of course |
| }; |
| |
| @interface TestObject : NSObject { |
| @public |
| id aSlot; |
| } |
| - (int) testVerbosely:(int)verbose; |
| |
| |
| @end |
| |
| @implementation TestObject |
| |
| |
| - (int) testVerbosely:(int)verbose |
| { |
| aSlot = [[NSObject alloc] init]; |
| |
| |
| void (^myBlock)(void) = ^{ |
| printf("[aSlot retainCount] == %d\n", (int)[aSlot retainCount]); |
| }; |
| struct Block_basic *basic = (struct Block_basic *)(void *)myBlock; |
| if (basic->Block_flags & BLOCK_NO_COPY) |
| abort (); |
| |
| return 0; |
| } |
| |
| |
| @end |
| |
| int main(int argc, char *argv[]) { |
| TestObject *to = [[TestObject alloc] init]; |
| |
| [to testVerbosely:1]; |
| return 0; |
| } |
| |