// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -fobjc-arc -x objective-c %s.result
// RUN: arcmt-test --args -triple x86_64-apple-darwin10 -fsyntax-only -x objective-c %s > %t
// RUN: diff %t %s.result

#include "Common.h"

@interface A : NSObject {
@package
    id object;
}
@end

@interface B : NSObject {
  id _prop;
  xpc_object_t _xpc_prop;
}
- (BOOL)containsSelf:(A*)a;
@property (retain) id prop;
@property (retain) xpc_object_t xpc_prop;
@end

@implementation A
@end

@implementation B
- (BOOL)containsSelf:(A*)a {
    return a->object == self;
}

-(id) prop {
  return _prop;
}
-(void) setProp:(id) newVal {
  [_prop autorelease];
  _prop = [newVal retain];
}
-(void) setProp2:(CFTypeRef) newVal {
  [_prop autorelease];
  _prop = (id)CFRetain(newVal);
}

-(id) xpc_prop {
  return _xpc_prop;
}
-(void) setXpc_prop:(xpc_object_t) newVal {
  [_xpc_prop autorelease];
  _xpc_prop = xpc_retain(newVal);
}
@end

void NSLog(id, ...);

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    A *a = [[A new] autorelease];
    B *b = [[B new] autorelease];
    NSLog(@"%s", [b containsSelf:a] ? "YES" : "NO");
    [pool drain];
    return 0;
}

void test(A *prevVal, A *newVal) {
  [prevVal autorelease];
  prevVal = [newVal retain];
}

id test2(A* val) {
  [[val retain] autorelease];
  return val;
}

id test3() {
  id a = [[A alloc] init];
  [a autorelease];
}
