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

#define nil 0

typedef int BOOL;

id IhaveSideEffect();

@protocol NSObject
- (BOOL)isEqual:(id)object;
- (id)retain;
- (oneway void)release;
@end

@interface NSObject <NSObject> {}
@end

@interface Foo : NSObject {
  id bar;
}
@property (strong) id bar;
-(void)test:(id)obj;
@end

@implementation Foo

@synthesize bar;

-(void)test:(id)obj {
  id x = self.bar;
  self.bar = obj;
  // do stuff with x;

  IhaveSideEffect();

  x = 0;

  @try {
  } @finally {
    x = nil;
  }
}
  
@end

void func(Foo *p) {
}

@interface Baz {
	id <NSObject> _foo;
}
@end

@implementation Baz
@end

void block_test(Foo *p) {
  id (^B)() = ^() {
    if (p) {
      id (^IB)() = ^() {
        id bar = p;
        return bar;
      };
      IB();
    }
    return p;
  };
}

#define RELEASE_MACRO(x) [x release]
#define RELEASE_MACRO2(x) RELEASE_MACRO(x)

void test2(id p) {
}

@implementation Foo2

static id internal_var = 0;

+ (void)setIt:(id)newone {
    if (internal_var != newone) {
        internal_var = newone;
    }
}
@end
