| // RUN: %clang_cc1 -analyze -analyzer-experimental-internal-checks -warn-objc-missing-dealloc '-DIBOutlet=__attribute__((iboutlet))' %s -verify |
| typedef signed char BOOL; |
| @protocol NSObject |
| - (BOOL)isEqual:(id)object; |
| - (Class)class; |
| @end |
| |
| @interface NSObject <NSObject> {} |
| - (void)dealloc; |
| - (id)init; |
| @end |
| |
| typedef struct objc_selector *SEL; |
| |
| // <rdar://problem/6380411>: 'myproperty' has kind 'assign' and thus the |
| // assignment through the setter does not perform a release. |
| |
| @interface MyObject : NSObject { |
| id _myproperty; |
| } |
| @property(assign) id myproperty; |
| @end |
| |
| @implementation MyObject |
| @synthesize myproperty=_myproperty; // no-warning |
| - (void)dealloc { |
| self.myproperty = 0; |
| [super dealloc]; |
| } |
| @end |
| |
| //===------------------------------------------------------------------------=== |
| // Don't warn about iVars that are selectors. |
| |
| @interface TestSELs : NSObject { |
| SEL a; |
| SEL b; |
| } |
| |
| @end |
| |
| @implementation TestSELs |
| - (id)init { |
| if( (self = [super init]) ) { |
| a = @selector(a); |
| b = @selector(b); |
| } |
| |
| return self; |
| } |
| @end |
| |
| //===------------------------------------------------------------------------=== |
| // Don't warn about iVars that are IBOutlets. |
| |
| #ifndef IBOutlet |
| #define IBOutlet |
| #endif |
| |
| @class NSWindow; |
| |
| @interface HasOutlet : NSObject { |
| IBOutlet NSWindow *window; |
| } |
| @end |
| |
| @implementation HasOutlet // no-warning |
| @end |
| |
| //===------------------------------------------------------------------------=== |
| // <rdar://problem/6380411> |
| // Was bogus warning: "The '_myproperty' instance variable was not retained by a |
| // synthesized property but was released in 'dealloc'" |
| |
| @interface MyObject_rdar6380411 : NSObject { |
| id _myproperty; |
| } |
| @property(assign) id myproperty; |
| @end |
| |
| @implementation MyObject_rdar6380411 |
| @synthesize myproperty=_myproperty; |
| - (void)dealloc { |
| // Don't claim that myproperty is released since it the property |
| // has the 'assign' attribute. |
| self.myproperty = 0; // no-warning |
| [super dealloc]; |
| } |
| @end |
| |
| //===------------------------------------------------------------------------=== |
| // PR 3187: http://llvm.org/bugs/show_bug.cgi?id=3187 |
| // - Disable the missing -dealloc check for classes that subclass SenTestCase |
| |
| @class NSString; |
| |
| @interface SenTestCase : NSObject {} |
| @end |
| |
| @interface MyClassTest : SenTestCase { |
| NSString *resourcePath; |
| } |
| @end |
| |
| @interface NSBundle : NSObject {} |
| + (NSBundle *)bundleForClass:(Class)aClass; |
| - (NSString *)resourcePath; |
| @end |
| |
| @implementation MyClassTest |
| - (void)setUp { |
| resourcePath = [[NSBundle bundleForClass:[self class]] resourcePath]; |
| } |
| - (void)testXXX { |
| // do something which uses resourcepath |
| } |
| @end |