block-implicit-byref.c   [plain text]


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