// RUN: %clang_cc1 -analyze -analyzer-checker=core -verify -analyzer-store=region %s

// Delta-Debugging reduced preamble.
typedef signed char BOOL;
typedef unsigned int NSUInteger;
@class NSString, Protocol;
extern void NSLog(NSString *format, ...) __attribute__((format(__NSString__, 1, 2)));
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> {} 
+ (id)alloc; 
- (id)init;
@end
extern id NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone);
@interface NSValue : NSObject <NSCopying, NSCoding>  - (void)getValue:(void *)value; @end
@class NSString, NSData;
typedef struct _NSPoint {} NSRange;
@interface NSValue (NSValueRangeExtensions) 
+ (NSValue *)valueWithRange:(NSRange)range;
- (id)objectAtIndex:(NSUInteger)index;
@end
@interface NSAutoreleasePool : NSObject {} - (void)drain; @end
extern NSString * const NSBundleDidLoadNotification;
typedef struct {} NSDecimal;
@interface NSNetService : NSObject {} - (id)init; @end
extern NSString * const NSUndoManagerCheckpointNotification;

// Test case: <rdar://problem/6145427>

int main (int argc, const char * argv[]) {
  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  id someUnintializedPointer = [someUnintializedPointer objectAtIndex:0]; // expected-warning{{Receiver in message expression is an uninitialized value}}
  NSLog(@"%@", someUnintializedPointer);    
  [pool drain];
  return 0;
}
