Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / clang / test / Analysis / inlining / retain-count-self-init.m
blobdeede9d94ae7dade7b9abab89880bcde82dacd9e
1 // RUN: %clang_analyze_cc1 -analyzer-checker=core,osx.cocoa.RetainCount,osx.cocoa.SelfInit -analyzer-config ipa=dynamic-bifurcate -verify %s
3 typedef signed char BOOL;
4 typedef struct objc_class *Class;
5 typedef 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
20 // We do not want to overhelm user with error messages in case they forgot to 
21 // assign to self and check that the result of [super init] is non-nil. So 
22 // stop tracking the receiver of init with respect to Retain Release checker.  
23 @interface ParentOfCell : NSObject
24 - (id)initWithInt: (int)inInt;
25 @end
26 @interface Cell : ParentOfCell{
27   int x;
29 - (id)init;
30 + (void)test;
31 @property int x;
32 @end
33 @implementation Cell
34 @synthesize x;
35 - (id) init {
36   [super init];
37   self.x = 3; // no-warning 
38   return self; // expected-warning {{Returning 'self' while it is not set to the result of '[(super or self)}} 
40 - (id) initWithInt: (int)inInt {
41   [super initWithInt: inInt];
42   self.x = inInt; // no-warning 
43   return self; // expected-warning {{Returning 'self' while it is not set to the result of '[(super or self)}} 
45 - (id) init2 {
46   [self init]; // The call [self init] is inlined. We will warn inside the inlined body.
47   self.x = 2; // no-warning 
48   return self; 
51 - (id) initWithIntGood: (int)inInt {
52     if (self = [super initWithInt: inInt]) {
53       self.x = inInt; 
54     }
55     return self; 
57 + (void) test {
58   Cell *sharedCell1 = [[Cell alloc] init];
59   [sharedCell1 release];
60   Cell *sharedCell2 = [[Cell alloc] initWithInt: 3];
61   [sharedCell2 release];
62   Cell *sharedCell3 = [[Cell alloc] initWithIntGood: 3];
63   [sharedCell3 release];
66 @end