// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount,alpha.core -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
