1// RUN: %clang_cc1 -analyze -analyzer-checker=alpha.core -analyzer-checker=alpha.osx.cocoa.Dealloc %s -verify 2 3// Tests for the checker which checks missing/extra ivar 'release' calls 4// in dealloc. 5 6@interface NSObject 7- (void)release; 8- dealloc; 9@end 10 11@interface MyClass : NSObject { 12@private 13 id _X; 14 id _Y; 15 id _Z; 16 id _K; 17 id _N; 18 id _M; 19 id _V; 20 id _W; 21} 22@property(retain) id X; 23@property(retain) id Y; 24@property(assign) id Z; 25@property(assign) id K; 26@property(readonly) id N; 27@property(retain) id M; 28@property(retain) id V; 29@property(retain) id W; 30-(id) O; 31-(void) setO: (id) arg; 32@end 33 34@implementation MyClass 35@synthesize X = _X; 36@synthesize Y = _Y; // expected-warning{{The '_Y' instance variable was retained by a synthesized property but wasn't released in 'dealloc'}} 37@synthesize Z = _Z; // expected-warning{{The '_Z' instance variable was not retained by a synthesized property but was released in 'dealloc'}} 38@synthesize K = _K; 39@synthesize N = _N; 40@synthesize M = _M; 41@synthesize V = _V; 42@synthesize W = _W; // expected-warning{{The '_W' instance variable was retained by a synthesized property but wasn't released in 'dealloc'}} 43 44-(id) O{ return 0; } 45-(void) setO:(id)arg { } 46 47- (id)dealloc 48{ 49 [_X release]; 50 [_Z release]; 51 [_N release]; 52 53 self.M = 0; // This will release '_M' 54 [self setV:0]; // This will release '_V' 55 [self setW:@"newW"]; // This will release '_W', but retain the new value 56 self.O = 0; // no-warning 57 [super dealloc]; 58 return 0; 59} 60 61@end 62 63