// RUN: %clang_cc1 -analyze -analyzer-experimental-internal-checks -analyzer-check-objc-mem -pedantic -analyzer-store=basic -verify %s
// RUN: %clang_cc1 -analyze -analyzer-experimental-internal-checks -analyzer-check-objc-mem -pedantic -analyzer-store=region -verify %s

// BEGIN delta-debugging reduced header stuff

typedef signed char BOOL;
typedef unsigned int NSUInteger;
typedef struct _NSZone NSZone;
@class NSCoder;
@protocol NSObject
- (BOOL)isEqual:(id)object;
- (id)retain;
- (oneway void)release;
@end
@protocol NSCopying
- (id)copyWithZone:(NSZone *)zone;
@end
@protocol NSCoding
- (void)encodeWithCoder:(NSCoder *)aCoder;
@end
@interface NSObject <NSObject> {}
- (id)init;
+ (id)alloc;
@end
typedef double NSTimeInterval;
enum { NSAnimationEaseInOut, NSAnimationEaseIn, NSAnimationEaseOut, NSAnimationLinear };
typedef NSUInteger NSAnimationCurve;
@interface NSAnimation : NSObject <NSCopying, NSCoding> {}
- (id)initWithDuration:(NSTimeInterval)duration animationCurve:(NSAnimationCurve)animationCurve;
- (void)startAnimation;
- (void)setDelegate:(id)delegate;
@end

// END delta-debugging reduced header stuff

// From NSAnimation Class Reference
// -(void)startAnimation
// The receiver retains itself and is then autoreleased at the end 
// of the animation or when it receives stopAnimation.

@interface MyClass { }
- (void)animationDidEnd:(NSAnimation *)animation;
@end

@implementation MyClass
- (void)f1 {  
  // NOTE: The analyzer doesn't really handle this; it just stops tracking
  // 'animation' when it is sent the message 'setDelegate:'.
  NSAnimation *animation = [[NSAnimation alloc]   // no-warning
                            initWithDuration:1.0 
                            animationCurve:NSAnimationEaseInOut];
  
  [animation setDelegate:self];
  [animation startAnimation]; 
}

- (void)f2 {
  NSAnimation *animation = [[NSAnimation alloc]  // expected-warning{{leak}}
                            initWithDuration:1.0 
                            animationCurve:NSAnimationEaseInOut];

  [animation startAnimation]; 
}

- (void)animationDidEnd:(NSAnimation *)animation {
  [animation release];
}
@end
