Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / clang / test / Analysis / MissingDealloc.m
blobbdba93c8815a252f2a1cc9d1d2d3172ce2a70d13
1 // RUN: %clang_analyze_cc1 -analyzer-checker=osx.cocoa.Dealloc -fblocks -verify %s
2 // RUN: %clang_analyze_cc1 -analyzer-checker=osx.cocoa.Dealloc -fblocks -verify -triple x86_64-apple-darwin10 -fobjc-arc %s
4 #define NON_ARC !__has_feature(objc_arc)
6 // No diagnostics expected under ARC.
7 #if !NON_ARC
8   // expected-no-diagnostics
9 #endif
11 typedef signed char BOOL;
12 @protocol NSObject
13 - (BOOL)isEqual:(id)object;
14 - (Class)class;
15 @end
17 @interface NSObject <NSObject> {}
18 - (void)dealloc;
19 - (id)init;
20 @end
22 typedef struct objc_selector *SEL;
24 //===------------------------------------------------------------------------===
25 // Do not warn about missing -dealloc method.  Not enough context to know
26 // whether the ivar is retained or not.
28 @interface MissingDeallocWithIvar : NSObject {
29   NSObject *_ivar;
31 @end
33 @implementation MissingDeallocWithIvar
34 @end
36 //===------------------------------------------------------------------------===
37 // Do not warn about missing -dealloc method.  These properties are not
38 // retained or synthesized.
40 @interface MissingDeallocWithIntProperty : NSObject
41 @property (assign) int ivar;
42 @end
44 @implementation MissingDeallocWithIntProperty
45 @end
47 @interface MissingDeallocWithSELProperty : NSObject
48 @property (assign) SEL ivar;
49 @end
51 @implementation MissingDeallocWithSELProperty
52 @end
54 //===------------------------------------------------------------------------===
55 // Warn about missing -dealloc method.
57 @interface MissingDeallocWithCopyProperty : NSObject
58 @property (copy) NSObject *ivar;
59 @end
61 #if NON_ARC
62 // expected-warning@+2{{'MissingDeallocWithCopyProperty' lacks a 'dealloc' instance method but must release '_ivar'}}
63 #endif
64 @implementation MissingDeallocWithCopyProperty
65 @end
67 @interface MissingDeallocWithRetainProperty : NSObject
68 @property (retain) NSObject *ivar;
69 @end
71 #if NON_ARC
72 // expected-warning@+2{{'MissingDeallocWithRetainProperty' lacks a 'dealloc' instance method but must release '_ivar'}}
73 #endif
74 @implementation MissingDeallocWithRetainProperty
75 @end
77 @interface MissingDeallocWithMultipleProperties : NSObject
78 @property (retain) NSObject *ivar1;
79 @property (retain) NSObject *ivar2;
80 @end
82 #if NON_ARC
83 // expected-warning@+2{{'MissingDeallocWithMultipleProperties' lacks a 'dealloc' instance method but must release '_ivar1' and others}}
84 #endif
85 @implementation MissingDeallocWithMultipleProperties
86 @end
88 @interface MissingDeallocWithIVarAndRetainProperty : NSObject {
89   NSObject *_ivar2;
91 @property (retain) NSObject *ivar1;
92 @end
94 #if NON_ARC
95 // expected-warning@+2{{'MissingDeallocWithIVarAndRetainProperty' lacks a 'dealloc' instance method but must release '_ivar1'}}
96 #endif
97 @implementation MissingDeallocWithIVarAndRetainProperty
98 @end
100 @interface MissingDeallocWithReadOnlyRetainedProperty : NSObject
101 @property (readonly,retain) NSObject *ivar;
102 @end
104 #if NON_ARC
105 // expected-warning@+2{{'MissingDeallocWithReadOnlyRetainedProperty' lacks a 'dealloc' instance method but must release '_ivar'}}
106 #endif
107 @implementation MissingDeallocWithReadOnlyRetainedProperty
108 @end
111 //===------------------------------------------------------------------------===
112 //  Don't warn about iVars that are selectors.
114 @interface TestSELs : NSObject {
115   SEL a;
116   SEL b;
119 @end
121 @implementation TestSELs
122 - (id)init {
123   if( (self = [super init]) ) {
124     a = @selector(a);
125     b = @selector(b);
126   }
128   return self;
130 @end
132 //===------------------------------------------------------------------------===
133 //  Don't warn about iVars that are IBOutlets.
135 @class NSWindow;
137 @interface HasOutlet : NSObject {
138 IBOutlet NSWindow *window;
140 @end
142 @implementation HasOutlet // no-warning
143 @end
145 //===------------------------------------------------------------------------===
146 // PR 3187: http://llvm.org/bugs/show_bug.cgi?id=3187
147 // - Disable the missing -dealloc check for classes that subclass SenTestCase
149 @class NSString;
151 @interface SenTestCase : NSObject {}
152 @end
154 @interface MyClassTest : SenTestCase {
155   NSString *resourcePath;
158 @property (retain) NSObject *ivar;
160 @end
162 @interface NSBundle : NSObject {}
163 + (NSBundle *)bundleForClass:(Class)aClass;
164 - (NSString *)resourcePath;
165 @end
167 @implementation MyClassTest
168 - (void)setUp {
169   resourcePath = [[NSBundle bundleForClass:[self class]] resourcePath];
171 - (void)testXXX {
172   // do something which uses resourcepath
174 @end
176 //===------------------------------------------------------------------------===
177 // Don't warn for clases that aren't subclasses of NSObject
179 __attribute__((objc_root_class))
180 @interface NonNSObjectMissingDealloc
181 @property (retain) NSObject *ivar;
182 @end
183 @implementation NonNSObjectMissingDealloc
184 @end
187 //===------------------------------------------------------------------------===
188 // Don't crash on calls to dealloc as a class method.
190 @interface DeallocingClass : NSObject {}
191 @end
192 @implementation DeallocingClass
193 - (void)dealloc {
194   [DeallocingClass dealloc]; // FIXME: Should we warn on this specifically?
196 #if NON_ARC
197 // expected-warning@-2{{method possibly missing a [super dealloc] call}}
198 #endif
199 @end