// RUN: clang-cc -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 {} - (void)dealloc; - (id)init; @end typedef struct objc_selector *SEL; // : '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 // no-warning - (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 //===------------------------------------------------------------------------=== // // 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