// RUN: %clang_analyze_cc1 -analyzer-checker=core,osx.cocoa.RetainCount,alpha.core,deadcode.DeadStores -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(void) {
  NSWindow *window = [[NSWindow alloc]
                      initWithContentRect:NSMakeRect(0,0,100,100) 
                        styleMask:NSTitledWindowMask|NSClosableWindowMask
                        backing:NSBackingStoreBuffered
                        defer:0]; 

  [window orderFrontRegardless]; // no-warning
}

void f2(void) {
  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(void) {
  // 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(void) {
  // FIXME: For now we don't track NSWindow.
  NSWindow *window = [NSWindow alloc];  // expected-warning{{never read}}
}
