xref: /aosp_15_r20/external/clang/test/Analysis/PR2978.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
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