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