// RUN: %clang_cc1 -analyze -verify -analyzer-store=basic -analyzer-check-objc-mem %s
// RUN: %clang_cc1 -analyze -verify -analyzer-store=region -analyzer-check-objc-mem %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; @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 a garbage value}}
  NSLog(@"%@", someUnintializedPointer);    
  [pool drain];
  return 0;
}
