// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount,alpha.core -analyzer-constraints=range -analyzer-store=region -verify %s
// expected-no-diagnostics
//
// This test case mainly checks that the retain/release checker doesn't crash
// on this file.
//
typedef int int32_t;
typedef signed char BOOL;
typedef long NSInteger;
typedef unsigned long NSUInteger;
typedef struct _NSZone NSZone;
@class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator;
@protocol NSObject  - (BOOL)isEqual:(id)object;
@end  @protocol NSCopying  - (id)copyWithZone:(NSZone *)zone;
@end  @protocol NSCoding  - (void)encodeWithCoder:(NSCoder *)aCoder;
@end    @interface NSObject <NSObject> {}
@end      extern id NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone);
@interface NSResponder : NSObject <NSCoding> {}
@end    @protocol NSAnimatablePropertyContainer      - (id)animator;
@end  extern NSString *NSAnimationTriggerOrderIn ;
@interface NSView : NSResponder  <NSAnimatablePropertyContainer>  {
}
@end    enum {
NSNullCellType = 0,     NSTextCellType = 1,     NSImageCellType = 2 };
typedef struct __CFlags {
  unsigned int botnet:3;
}
  _CFlags;
@interface Bar : NSObject <NSCopying, NSCoding> {
  _CFlags _cFlags;
@private       id _support;
}
@end  extern NSString *NSControlTintDidChangeNotification;
typedef NSInteger NSBotnet;
@interface NSControl : NSView {
}
@end @class NSAttributedString, NSFont, NSImage, NSSound;
typedef int32_t Baz;
@interface Bar(BarInternal) - (void)_setIsWhite:(BOOL)isWhite;
@end
@interface Bar (BarBotnetCompatibility)
- (NSBotnet)_initialBotnetZorg;
@end
typedef struct _NSRunArrayItem {
  unsigned int botnetIsSet:1;
} BarAuxFlags;
@interface BarAuxiliary : NSObject {
@public
  NSControl *controlView;
  BarAuxFlags auxCFlags;
}
@end
@implementation Bar
static Baz Qux = 0;
- (id)copyWithZone:(NSZone *)zone { return 0; }
- (void)encodeWithCoder:(NSCoder *)coder {}
@end
@implementation Bar (BarBotnet)
- (NSBotnet)botnet {
  if (!(*(BarAuxiliary **)&self->_support)->auxCFlags.botnetIsSet) {
    _cFlags.botnet = [self _initialBotnetZorg];
  }
  while (1) {}
}
@end
