1*67e74705SXin Li// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount -analyzer-store=region -verify -Wno-objc-root-class %s 2*67e74705SXin Li 3*67e74705SXin Litypedef signed char BOOL; 4*67e74705SXin Litypedef unsigned int NSUInteger; 5*67e74705SXin Li 6*67e74705SXin Li@interface NSObject 7*67e74705SXin Li+(id)alloc; 8*67e74705SXin Li-(id)init; 9*67e74705SXin Li-(id)autorelease; 10*67e74705SXin Li-(id)copy; 11*67e74705SXin Li-(id)retain; 12*67e74705SXin Li@end 13*67e74705SXin Li 14*67e74705SXin Li@interface Subscriptable : NSObject 15*67e74705SXin Li- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)index; 16*67e74705SXin Li- (id)objectAtIndexedSubscript:(NSUInteger)index; 17*67e74705SXin Li 18*67e74705SXin Li- (void)setObject:(id)obj forKeyedSubscript:(id)key; 19*67e74705SXin Li- (id)objectForKeyedSubscript:(id)key; 20*67e74705SXin Li@end 21*67e74705SXin Li 22*67e74705SXin Li@interface Test : Subscriptable 23*67e74705SXin Li@end 24*67e74705SXin Li 25*67e74705SXin Li@implementation Test 26*67e74705SXin Li 27*67e74705SXin Li// <rdar://problem/6946338> for subscripting 28*67e74705SXin Li- (id)storeDoesNotRetain { 29*67e74705SXin Li Test *cell = [[[Test alloc] init] autorelease]; 30*67e74705SXin Li 31*67e74705SXin Li NSObject *string1 = [[NSObject alloc] init]; // expected-warning {{Potential leak}} 32*67e74705SXin Li cell[0] = string1; 33*67e74705SXin Li cell[self] = string1; 34*67e74705SXin Li cell[string1] = self; 35*67e74705SXin Li 36*67e74705SXin Li return cell; 37*67e74705SXin Li} 38*67e74705SXin Li 39*67e74705SXin Li// <rdar://problem/8824416> for subscripting 40*67e74705SXin Li- (id)getDoesNotRetain:(BOOL)keyed { 41*67e74705SXin Li if (keyed) 42*67e74705SXin Li return [self[self] autorelease]; // expected-warning{{Object autoreleased too many times}} 43*67e74705SXin Li else 44*67e74705SXin Li return [self[0] autorelease]; // expected-warning{{Object autoreleased too many times}} 45*67e74705SXin Li} 46*67e74705SXin Li 47*67e74705SXin Li// <rdar://problem/9241180> for subscripting 48*67e74705SXin Li- (id)testUninitializedObject:(BOOL)keyed { 49*67e74705SXin Li Test *o; 50*67e74705SXin Li if (keyed) { 51*67e74705SXin Li if (o[self]) // expected-warning {{Subscript access on an uninitialized object pointer}} 52*67e74705SXin Li return o; // no-warning (sink) 53*67e74705SXin Li } else { 54*67e74705SXin Li if (o[0]) // expected-warning {{Subscript access on an uninitialized object pointer}} 55*67e74705SXin Li return o; // no-warning (sink) 56*67e74705SXin Li } 57*67e74705SXin Li return self; 58*67e74705SXin Li} 59*67e74705SXin Li 60*67e74705SXin Li- (void)testUninitializedArgument:(id)input testCase:(unsigned)testCase { 61*67e74705SXin Li NSUInteger i; 62*67e74705SXin Li id o; 63*67e74705SXin Li 64*67e74705SXin Li switch (testCase) { 65*67e74705SXin Li case 0: 66*67e74705SXin Li self[0] = o; // expected-warning {{Argument for subscript setter is an uninitialized value}} 67*67e74705SXin Li break; 68*67e74705SXin Li case 1: 69*67e74705SXin Li self[i] = input; // expected-warning {{Subscript index is an uninitialized value}} 70*67e74705SXin Li break; 71*67e74705SXin Li case 2: 72*67e74705SXin Li (void)self[i]; // expected-warning {{Subscript index is an uninitialized value}} 73*67e74705SXin Li break; 74*67e74705SXin Li case 3: 75*67e74705SXin Li self[input] = o; // expected-warning {{Argument for subscript setter is an uninitialized value}} 76*67e74705SXin Li break; 77*67e74705SXin Li case 4: 78*67e74705SXin Li self[o] = input; // expected-warning {{Subscript index is an uninitialized value}} 79*67e74705SXin Li break; 80*67e74705SXin Li case 5: 81*67e74705SXin Li (void)self[o]; // expected-warning {{Subscript index is an uninitialized value}} 82*67e74705SXin Li break; 83*67e74705SXin Li default: 84*67e74705SXin Li break; 85*67e74705SXin Li } 86*67e74705SXin Li 87*67e74705SXin Li} 88*67e74705SXin Li 89*67e74705SXin Li@end 90