1*67e74705SXin Li// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.core,osx.cocoa.Dealloc %s -verify 2*67e74705SXin Li 3*67e74705SXin Li// Tests for the checker which checks missing/extra ivar 'release' calls 4*67e74705SXin Li// in dealloc. 5*67e74705SXin Li 6*67e74705SXin Li@interface NSObject 7*67e74705SXin Li- (void)release; 8*67e74705SXin Li- (void)dealloc; 9*67e74705SXin Li@end 10*67e74705SXin Li 11*67e74705SXin Li@interface MyClass : NSObject { 12*67e74705SXin Li@private 13*67e74705SXin Li id _X; 14*67e74705SXin Li id _Y; 15*67e74705SXin Li id _Z; 16*67e74705SXin Li id _K; 17*67e74705SXin Li id _L; 18*67e74705SXin Li id _N; 19*67e74705SXin Li id _M; 20*67e74705SXin Li id _P; 21*67e74705SXin Li id _Q; 22*67e74705SXin Li id _R; 23*67e74705SXin Li id _S; 24*67e74705SXin Li id _V; 25*67e74705SXin Li id _W; 26*67e74705SXin Li 27*67e74705SXin Li MyClass *_other; 28*67e74705SXin Li 29*67e74705SXin Li id _nonPropertyIvar; 30*67e74705SXin Li} 31*67e74705SXin Li@property(retain) id X; 32*67e74705SXin Li@property(retain) id Y; 33*67e74705SXin Li@property(assign) id Z; 34*67e74705SXin Li@property(assign) id K; 35*67e74705SXin Li@property(weak) id L; 36*67e74705SXin Li@property(readonly) id N; 37*67e74705SXin Li@property(retain) id M; 38*67e74705SXin Li@property(weak) id P; 39*67e74705SXin Li@property(weak) id Q; 40*67e74705SXin Li@property(retain) id R; 41*67e74705SXin Li@property(weak, readonly) id S; 42*67e74705SXin Li 43*67e74705SXin Li@property(assign, readonly) id T; // Shadowed in class extension 44*67e74705SXin Li@property(assign) id U; 45*67e74705SXin Li 46*67e74705SXin Li@property(retain) id V; 47*67e74705SXin Li@property(retain) id W; 48*67e74705SXin Li-(id) O; 49*67e74705SXin Li-(void) setO: (id) arg; 50*67e74705SXin Li@end 51*67e74705SXin Li 52*67e74705SXin Li@interface MyClass () 53*67e74705SXin Li// Shadows T to make it readwrite internally but readonly externally. 54*67e74705SXin Li@property(assign, readwrite) id T; 55*67e74705SXin Li@end 56*67e74705SXin Li 57*67e74705SXin Li@implementation MyClass 58*67e74705SXin Li@synthesize X = _X; 59*67e74705SXin Li@synthesize Y = _Y; 60*67e74705SXin Li@synthesize Z = _Z; 61*67e74705SXin Li@synthesize K = _K; 62*67e74705SXin Li@synthesize L = _L; 63*67e74705SXin Li@synthesize N = _N; 64*67e74705SXin Li@synthesize M = _M; 65*67e74705SXin Li@synthesize Q = _Q; 66*67e74705SXin Li@synthesize R = _R; 67*67e74705SXin Li@synthesize V = _V; 68*67e74705SXin Li@synthesize W = _W; 69*67e74705SXin Li 70*67e74705SXin Li-(id) O{ return 0; } 71*67e74705SXin Li-(void) setO:(id)arg { } 72*67e74705SXin Li 73*67e74705SXin Li 74*67e74705SXin Li-(void) releaseInHelper { 75*67e74705SXin Li [_R release]; // no-warning 76*67e74705SXin Li _R = @"Hi"; 77*67e74705SXin Li} 78*67e74705SXin Li 79*67e74705SXin Li- (void)dealloc 80*67e74705SXin Li{ 81*67e74705SXin Li 82*67e74705SXin Li [_X release]; 83*67e74705SXin Li [_Z release]; // expected-warning{{The '_Z' ivar in 'MyClass' was synthesized for an assign, readwrite property but was released in 'dealloc'}} 84*67e74705SXin Li [_T release]; // no-warning 85*67e74705SXin Li 86*67e74705SXin Li [_other->_Z release]; // no-warning 87*67e74705SXin Li [_N release]; 88*67e74705SXin Li 89*67e74705SXin Li self.M = 0; // This will release '_M' 90*67e74705SXin Li [self setV:0]; // This will release '_V' 91*67e74705SXin Li [self setW:@"newW"]; // This will release '_W', but retain the new value 92*67e74705SXin Li 93*67e74705SXin Li [_S release]; // expected-warning {{The '_S' ivar in 'MyClass' was synthesized for a weak property but was released in 'dealloc'}} 94*67e74705SXin Li 95*67e74705SXin Li self.O = 0; // no-warning 96*67e74705SXin Li 97*67e74705SXin Li [_Q release]; // expected-warning {{The '_Q' ivar in 'MyClass' was synthesized for a weak property but was released in 'dealloc'}} 98*67e74705SXin Li 99*67e74705SXin Li self.P = 0; 100*67e74705SXin Li 101*67e74705SXin Li [self releaseInHelper]; 102*67e74705SXin Li 103*67e74705SXin Li [_nonPropertyIvar release]; // no-warning 104*67e74705SXin Li 105*67e74705SXin Li // Silly, but not an error. 106*67e74705SXin Li if (!_U) 107*67e74705SXin Li [_U release]; 108*67e74705SXin Li 109*67e74705SXin Li [super dealloc]; 110*67e74705SXin Li // expected-warning@-1{{The '_Y' ivar in 'MyClass' was retained by a synthesized property but not released before '[super dealloc]'}} 111*67e74705SXin Li // expected-warning@-2{{The '_W' ivar in 'MyClass' was retained by a synthesized property but not released before '[super dealloc]'}} 112*67e74705SXin Li 113*67e74705SXin Li} 114*67e74705SXin Li 115*67e74705SXin Li@end 116*67e74705SXin Li 117