1*67e74705SXin Li// RUN: %clang_cc1 -analyze -analyzer-checker=osx.cocoa.Dealloc -fblocks -verify %s 2*67e74705SXin Li// RUN: %clang_cc1 -analyze -analyzer-checker=osx.cocoa.Dealloc -fblocks -verify -triple x86_64-apple-darwin10 -fobjc-arc %s 3*67e74705SXin Li 4*67e74705SXin Li#define NON_ARC !__has_feature(objc_arc) 5*67e74705SXin Li 6*67e74705SXin Li// No diagnostics expected under ARC. 7*67e74705SXin Li#if !NON_ARC 8*67e74705SXin Li // expected-no-diagnostics 9*67e74705SXin Li#endif 10*67e74705SXin Li 11*67e74705SXin Litypedef signed char BOOL; 12*67e74705SXin Li@protocol NSObject 13*67e74705SXin Li- (BOOL)isEqual:(id)object; 14*67e74705SXin Li- (Class)class; 15*67e74705SXin Li@end 16*67e74705SXin Li 17*67e74705SXin Li@interface NSObject <NSObject> {} 18*67e74705SXin Li- (void)dealloc; 19*67e74705SXin Li- (id)init; 20*67e74705SXin Li@end 21*67e74705SXin Li 22*67e74705SXin Litypedef struct objc_selector *SEL; 23*67e74705SXin Li 24*67e74705SXin Li//===------------------------------------------------------------------------=== 25*67e74705SXin Li// Do not warn about missing -dealloc method. Not enough context to know 26*67e74705SXin Li// whether the ivar is retained or not. 27*67e74705SXin Li 28*67e74705SXin Li@interface MissingDeallocWithIvar : NSObject { 29*67e74705SXin Li NSObject *_ivar; 30*67e74705SXin Li} 31*67e74705SXin Li@end 32*67e74705SXin Li 33*67e74705SXin Li@implementation MissingDeallocWithIvar 34*67e74705SXin Li@end 35*67e74705SXin Li 36*67e74705SXin Li//===------------------------------------------------------------------------=== 37*67e74705SXin Li// Do not warn about missing -dealloc method. These properties are not 38*67e74705SXin Li// retained or synthesized. 39*67e74705SXin Li 40*67e74705SXin Li@interface MissingDeallocWithIntProperty : NSObject 41*67e74705SXin Li@property (assign) int ivar; 42*67e74705SXin Li@end 43*67e74705SXin Li 44*67e74705SXin Li@implementation MissingDeallocWithIntProperty 45*67e74705SXin Li@end 46*67e74705SXin Li 47*67e74705SXin Li@interface MissingDeallocWithSELProperty : NSObject 48*67e74705SXin Li@property (assign) SEL ivar; 49*67e74705SXin Li@end 50*67e74705SXin Li 51*67e74705SXin Li@implementation MissingDeallocWithSELProperty 52*67e74705SXin Li@end 53*67e74705SXin Li 54*67e74705SXin Li//===------------------------------------------------------------------------=== 55*67e74705SXin Li// Warn about missing -dealloc method. 56*67e74705SXin Li 57*67e74705SXin Li@interface MissingDeallocWithCopyProperty : NSObject 58*67e74705SXin Li@property (copy) NSObject *ivar; 59*67e74705SXin Li@end 60*67e74705SXin Li 61*67e74705SXin Li#if NON_ARC 62*67e74705SXin Li// expected-warning@+2{{'MissingDeallocWithCopyProperty' lacks a 'dealloc' instance method but must release '_ivar'}} 63*67e74705SXin Li#endif 64*67e74705SXin Li@implementation MissingDeallocWithCopyProperty 65*67e74705SXin Li@end 66*67e74705SXin Li 67*67e74705SXin Li@interface MissingDeallocWithRetainProperty : NSObject 68*67e74705SXin Li@property (retain) NSObject *ivar; 69*67e74705SXin Li@end 70*67e74705SXin Li 71*67e74705SXin Li#if NON_ARC 72*67e74705SXin Li// expected-warning@+2{{'MissingDeallocWithRetainProperty' lacks a 'dealloc' instance method but must release '_ivar'}} 73*67e74705SXin Li#endif 74*67e74705SXin Li@implementation MissingDeallocWithRetainProperty 75*67e74705SXin Li@end 76*67e74705SXin Li 77*67e74705SXin Li@interface MissingDeallocWithMultipleProperties : NSObject 78*67e74705SXin Li@property (retain) NSObject *ivar1; 79*67e74705SXin Li@property (retain) NSObject *ivar2; 80*67e74705SXin Li@end 81*67e74705SXin Li 82*67e74705SXin Li#if NON_ARC 83*67e74705SXin Li// expected-warning@+2{{'MissingDeallocWithMultipleProperties' lacks a 'dealloc' instance method but must release '_ivar1' and others}} 84*67e74705SXin Li#endif 85*67e74705SXin Li@implementation MissingDeallocWithMultipleProperties 86*67e74705SXin Li@end 87*67e74705SXin Li 88*67e74705SXin Li@interface MissingDeallocWithIVarAndRetainProperty : NSObject { 89*67e74705SXin Li NSObject *_ivar2; 90*67e74705SXin Li} 91*67e74705SXin Li@property (retain) NSObject *ivar1; 92*67e74705SXin Li@end 93*67e74705SXin Li 94*67e74705SXin Li#if NON_ARC 95*67e74705SXin Li// expected-warning@+2{{'MissingDeallocWithIVarAndRetainProperty' lacks a 'dealloc' instance method but must release '_ivar1'}} 96*67e74705SXin Li#endif 97*67e74705SXin Li@implementation MissingDeallocWithIVarAndRetainProperty 98*67e74705SXin Li@end 99*67e74705SXin Li 100*67e74705SXin Li@interface MissingDeallocWithReadOnlyRetainedProperty : NSObject 101*67e74705SXin Li@property (readonly,retain) NSObject *ivar; 102*67e74705SXin Li@end 103*67e74705SXin Li 104*67e74705SXin Li#if NON_ARC 105*67e74705SXin Li// expected-warning@+2{{'MissingDeallocWithReadOnlyRetainedProperty' lacks a 'dealloc' instance method but must release '_ivar'}} 106*67e74705SXin Li#endif 107*67e74705SXin Li@implementation MissingDeallocWithReadOnlyRetainedProperty 108*67e74705SXin Li@end 109*67e74705SXin Li 110*67e74705SXin Li 111*67e74705SXin Li//===------------------------------------------------------------------------=== 112*67e74705SXin Li// Don't warn about iVars that are selectors. 113*67e74705SXin Li 114*67e74705SXin Li@interface TestSELs : NSObject { 115*67e74705SXin Li SEL a; 116*67e74705SXin Li SEL b; 117*67e74705SXin Li} 118*67e74705SXin Li 119*67e74705SXin Li@end 120*67e74705SXin Li 121*67e74705SXin Li@implementation TestSELs 122*67e74705SXin Li- (id)init { 123*67e74705SXin Li if( (self = [super init]) ) { 124*67e74705SXin Li a = @selector(a); 125*67e74705SXin Li b = @selector(b); 126*67e74705SXin Li } 127*67e74705SXin Li 128*67e74705SXin Li return self; 129*67e74705SXin Li} 130*67e74705SXin Li@end 131*67e74705SXin Li 132*67e74705SXin Li//===------------------------------------------------------------------------=== 133*67e74705SXin Li// Don't warn about iVars that are IBOutlets. 134*67e74705SXin Li 135*67e74705SXin Li@class NSWindow; 136*67e74705SXin Li 137*67e74705SXin Li@interface HasOutlet : NSObject { 138*67e74705SXin LiIBOutlet NSWindow *window; 139*67e74705SXin Li} 140*67e74705SXin Li@end 141*67e74705SXin Li 142*67e74705SXin Li@implementation HasOutlet // no-warning 143*67e74705SXin Li@end 144*67e74705SXin Li 145*67e74705SXin Li//===------------------------------------------------------------------------=== 146*67e74705SXin Li// PR 3187: http://llvm.org/bugs/show_bug.cgi?id=3187 147*67e74705SXin Li// - Disable the missing -dealloc check for classes that subclass SenTestCase 148*67e74705SXin Li 149*67e74705SXin Li@class NSString; 150*67e74705SXin Li 151*67e74705SXin Li@interface SenTestCase : NSObject {} 152*67e74705SXin Li@end 153*67e74705SXin Li 154*67e74705SXin Li@interface MyClassTest : SenTestCase { 155*67e74705SXin Li NSString *resourcePath; 156*67e74705SXin Li} 157*67e74705SXin Li 158*67e74705SXin Li@property (retain) NSObject *ivar; 159*67e74705SXin Li 160*67e74705SXin Li@end 161*67e74705SXin Li 162*67e74705SXin Li@interface NSBundle : NSObject {} 163*67e74705SXin Li+ (NSBundle *)bundleForClass:(Class)aClass; 164*67e74705SXin Li- (NSString *)resourcePath; 165*67e74705SXin Li@end 166*67e74705SXin Li 167*67e74705SXin Li@implementation MyClassTest 168*67e74705SXin Li- (void)setUp { 169*67e74705SXin Li resourcePath = [[NSBundle bundleForClass:[self class]] resourcePath]; 170*67e74705SXin Li} 171*67e74705SXin Li- (void)testXXX { 172*67e74705SXin Li // do something which uses resourcepath 173*67e74705SXin Li} 174*67e74705SXin Li@end 175*67e74705SXin Li 176*67e74705SXin Li//===------------------------------------------------------------------------=== 177*67e74705SXin Li// Don't warn for clases that aren't subclasses of NSObject 178*67e74705SXin Li 179*67e74705SXin Li__attribute__((objc_root_class)) 180*67e74705SXin Li@interface NonNSObjectMissingDealloc 181*67e74705SXin Li@property (retain) NSObject *ivar; 182*67e74705SXin Li@end 183*67e74705SXin Li@implementation NonNSObjectMissingDealloc 184*67e74705SXin Li@end 185*67e74705SXin Li 186*67e74705SXin Li// CHECK: 4 warnings generated. 187