// RUN: %clang_analyze_cc1 -analyzer-checker=core,osx.cocoa.RetainCount,alpha.core,deadcode.DeadStores -analyzer-store=region -verify %s

// These declarations were reduced using Delta-Debugging from Foundation.h
// on Mac OS X.  The test cases are below.

typedef struct objc_selector *SEL;
typedef signed char BOOL;
typedef unsigned int NSUInteger;
@class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator;
@protocol NSObject
- (BOOL)isEqual:(id)object;
- (id)retain;
@end
@protocol NSCoding  - (void)encodeWithCoder:(NSCoder *)aCoder;
@end
@interface NSObject <NSObject> {}
  + (id)alloc;
@end
typedef float CGFloat;
typedef struct _NSPoint {} NSRect;
NSRect NSMakeRect(CGFloat x, CGFloat y, CGFloat w, CGFloat h);
enum { NSBackingStoreRetained = 0,     NSBackingStoreNonretained = 1,     NSBackingStoreBuffered = 2 };
typedef NSUInteger NSBackingStoreType;
@interface NSResponder : NSObject <NSCoding> {}
@end
@protocol NSAnimatablePropertyContainer
- (id)animator;
@end
extern NSString *NSAnimationTriggerOrderIn ;
@class CIFilter, CALayer, NSDictionary, NSScreen, NSShadow, NSTrackingArea;
@interface NSView : NSResponder  <NSAnimatablePropertyContainer>  {} @end
@protocol NSValidatedUserInterfaceItem - (SEL)action; @end
@protocol NSUserInterfaceValidations - (BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)anItem; @end   @class NSNotification, NSText, NSView, NSMutableSet, NSSet, NSDate;
enum { NSBorderlessWindowMask = 0,     NSTitledWindowMask = 1 << 0,     NSClosableWindowMask = 1 << 1,     NSMiniaturizableWindowMask = 1 << 2,     NSResizableWindowMask = 1 << 3  };
@interface NSWindow : NSResponder  <NSAnimatablePropertyContainer, NSUserInterfaceValidations>    {
  struct __wFlags {} _wFlags;
}
- (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag;
- (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag screen:(NSScreen *)screen;
- (void)orderFrontRegardless;
@end

extern NSString *NSWindowDidBecomeKeyNotification;

// Test cases.

void f1() {
  NSWindow *window = [[NSWindow alloc]
                      initWithContentRect:NSMakeRect(0,0,100,100) 
                        styleMask:NSTitledWindowMask|NSClosableWindowMask
                        backing:NSBackingStoreBuffered
                        defer:0]; 

  [window orderFrontRegardless]; // no-warning
}

void f2() {
  NSWindow *window = [[NSWindow alloc]
                      initWithContentRect:NSMakeRect(0,0,100,100) 
                        styleMask:NSTitledWindowMask|NSClosableWindowMask
                        backing:NSBackingStoreBuffered
                        defer:0
                        screen:0]; 

  [window orderFrontRegardless]; // no-warning
}

void f2b() {
  // FIXME: NSWindow doesn't own itself until it is displayed.
  NSWindow *window = [[NSWindow alloc] // no-warning
                      initWithContentRect:NSMakeRect(0,0,100,100) 
                        styleMask:NSTitledWindowMask|NSClosableWindowMask
                        backing:NSBackingStoreBuffered
                        defer:0
                        screen:0]; 

  [window orderFrontRegardless];
  
  [window retain];
}


void f3() {
  // FIXME: For now we don't track NSWindow.
  NSWindow *window = [NSWindow alloc];  // expected-warning{{never read}}
}
