blob: c48e7b068d852591c6b4323b4af315a6d5e166af [file] [log] [blame]
Anna Zaksc7394062012-08-14 00:36:20 +00001// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount -analyzer-ipa=dynamic-bifurcate -verify %s
2
3typedef signed char BOOL;
4typedef struct objc_class *Class;
5typedef struct objc_object {
6 Class isa;
7} *id;
8@protocol NSObject - (BOOL)isEqual:(id)object; @end
9@interface NSObject <NSObject> {}
10+(id)alloc;
11+(id)new;
12- (oneway void)release;
13-(id)init;
14-(id)autorelease;
15-(id)copy;
16- (Class)class;
17-(id)retain;
18@end
19
20@interface SelfStaysLive : NSObject
21- (id)init;
22@end
23
24@implementation SelfStaysLive
25- (id)init {
26 return [super init];
27}
28@end
29
30void selfStaysLive() {
31 SelfStaysLive *foo = [[SelfStaysLive alloc] init];
32 [foo release];
Anna Zaks5a901932012-08-24 00:06:12 +000033}
34
35// Test that retain release checker warns on leaks and use-after-frees when
36// self init is not enabled.
37// radar://12115830
38@interface ParentOfCell : NSObject
39- (id)initWithInt: (int)inInt;
40@end
41@interface Cell : ParentOfCell{
42 int x;
43}
44- (id)initWithInt: (int)inInt;
45+ (void)testOverRelease;
46+ (void)testLeak;
47@property int x;
48@end
49@implementation Cell
50@synthesize x;
51- (id) initWithInt: (int)inInt {
52 [super initWithInt: inInt];
53 self.x = inInt; // no-warning
54 return self; // Self Init checker would produce a warning here.
55}
56+ (void) testOverRelease {
57 Cell *sharedCell3 = [[Cell alloc] initWithInt: 3];
58 [sharedCell3 release];
59 [sharedCell3 release]; // expected-warning {{Reference-counted object is used after it is released}}
60}
61+ (void) testLeak {
62 Cell *sharedCell4 = [[Cell alloc] initWithInt: 3]; // expected-warning {{leak}}
63}
64@end
65