2008-04-21-StrongIvarAssignment.m   [plain text]


/* { dg-do run { target *-*-darwin* } } */
/* { dg-options "-fobjc-gc -framework Foundation" } */
#import <Foundation/Foundation.h>
#import <Foundation/NSString.h>

uintptr_t OldPointerVal;
uintptr_t NewPointerVal;

@class Bork;

typedef struct {
  NSString *name;
} Info;

@interface Bork : NSObject {
@private
  CFMutableDictionaryRef _f1;
  __strong Info*         _f2;
}

- (void) foo:(NSString*)name;
@end

@implementation Bork
- (id)init {
  _f2 = malloc(sizeof(Info) * 3);

  unsigned i;
  for (i = 0; i < 3; ++i)
    _f2[i].name = 0;
}

- (void)foo:(NSString*)name {
  OldPointerVal = (uintptr_t)_f2;
  _f2[0].name = [name copy];
  NewPointerVal = (uintptr_t)_f2;
}
@end

int main() {
  Bork *NM = [Bork alloc];
  [NM init];
  NSString *Str = [NSString stringWithUTF8String: "Hello world"];
  [NM foo: Str];
  if (OldPointerVal != NewPointerVal)
    abort();
  [NM release];
}