1*67e74705SXin Li// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount -analyzer-store=region -Wno-objc-root-class -verify %s 2*67e74705SXin Li// expected-no-diagnostics 3*67e74705SXin Li 4*67e74705SXin Li 5*67e74705SXin Li//===----------------------------------------------------------------------===// 6*67e74705SXin Li// The following code is reduced using delta-debugging from 7*67e74705SXin Li// Foundation.h (Mac OS X). 8*67e74705SXin Li// 9*67e74705SXin Li// It includes the basic definitions for the test cases below. 10*67e74705SXin Li// Not directly including Foundation.h directly makes this test case 11*67e74705SXin Li// both svelte and portable to non-Mac platforms. 12*67e74705SXin Li//===----------------------------------------------------------------------===// 13*67e74705SXin Li 14*67e74705SXin Litypedef const void * CFTypeRef; 15*67e74705SXin Litypedef const struct __CFString * CFStringRef; 16*67e74705SXin Litypedef const struct __CFAllocator * CFAllocatorRef; 17*67e74705SXin Liextern const CFAllocatorRef kCFAllocatorDefault; 18*67e74705SXin Liextern CFTypeRef CFRetain(CFTypeRef cf); 19*67e74705SXin Livoid CFRelease(CFTypeRef cf); 20*67e74705SXin Litypedef const struct __CFDictionary * CFDictionaryRef; 21*67e74705SXin Liconst void *CFDictionaryGetValue(CFDictionaryRef theDict, const void *key); 22*67e74705SXin Liextern CFStringRef CFStringCreateWithFormat(CFAllocatorRef alloc, CFDictionaryRef formatOptions, CFStringRef format, ...); 23*67e74705SXin Litypedef signed char BOOL; 24*67e74705SXin Litypedef int NSInteger; 25*67e74705SXin Litypedef unsigned int NSUInteger; 26*67e74705SXin Litypedef struct objc_selector *SEL; 27*67e74705SXin Li@class NSString, Protocol; 28*67e74705SXin Liextern void NSLog(NSString *format, ...) __attribute__((format(__NSString__, 1, 2))); 29*67e74705SXin Litypedef NSInteger NSComparisonResult; 30*67e74705SXin Litypedef struct _NSZone NSZone; 31*67e74705SXin Li@class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator; 32*67e74705SXin Li@protocol NSObject 33*67e74705SXin Li- (BOOL)isEqual:(id)object; 34*67e74705SXin Li- (oneway void)release; 35*67e74705SXin Li- (Class)class; 36*67e74705SXin Li- (id)retain; 37*67e74705SXin Li@end 38*67e74705SXin Li@protocol NSCopying 39*67e74705SXin Li- (id)copyWithZone:(NSZone *)zone; 40*67e74705SXin Li@end 41*67e74705SXin Li@protocol NSMutableCopying 42*67e74705SXin Li- (id)mutableCopyWithZone:(NSZone *)zone; 43*67e74705SXin Li@end 44*67e74705SXin Li@protocol NSCoding 45*67e74705SXin Li- (void)encodeWithCoder:(NSCoder *)aCoder; 46*67e74705SXin Li@end 47*67e74705SXin Li@interface NSObject <NSObject> {} 48*67e74705SXin Li- (id)init; 49*67e74705SXin Li+ (id)alloc; 50*67e74705SXin Li+ (Class)class; 51*67e74705SXin Li- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; 52*67e74705SXin Li@end 53*67e74705SXin Liextern id NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone); 54*67e74705SXin Litypedef struct {} NSFastEnumerationState; 55*67e74705SXin Li@protocol NSFastEnumeration 56*67e74705SXin Li- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len; 57*67e74705SXin Li@end 58*67e74705SXin Li@class NSString; 59*67e74705SXin Litypedef struct _NSRange {} NSRange; 60*67e74705SXin Li@interface NSArray : NSObject <NSCopying, NSMutableCopying, NSCoding, NSFastEnumeration> 61*67e74705SXin Li- (NSUInteger)count; 62*67e74705SXin Li@end 63*67e74705SXin Li@interface NSMutableArray : NSArray 64*67e74705SXin Li- (void)addObject:(id)anObject; 65*67e74705SXin Li- (id)initWithCapacity:(NSUInteger)numItems; 66*67e74705SXin Li@end 67*67e74705SXin Litypedef unsigned short unichar; 68*67e74705SXin Li@class NSData, NSArray, NSDictionary, NSCharacterSet, NSData, NSURL, NSError, NSLocale; 69*67e74705SXin Litypedef NSUInteger NSStringCompareOptions; 70*67e74705SXin Li@interface NSString : NSObject <NSCopying, NSMutableCopying, NSCoding> - (NSUInteger)length; 71*67e74705SXin Li- (NSComparisonResult)compare:(NSString *)string; 72*67e74705SXin Li- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask; 73*67e74705SXin Li- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)compareRange; 74*67e74705SXin Li- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)compareRange locale:(id)locale; 75*67e74705SXin Li- (NSComparisonResult)caseInsensitiveCompare:(NSString *)string; 76*67e74705SXin Li- (NSArray *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator; 77*67e74705SXin Li@end 78*67e74705SXin Li@interface NSSimpleCString : NSString {} @end 79*67e74705SXin Li@interface NSConstantString : NSSimpleCString @end 80*67e74705SXin Liextern void *_NSConstantStringClassReference; 81*67e74705SXin Li 82*67e74705SXin Li//===----------------------------------------------------------------------===// 83*67e74705SXin Li// Test cases. 84*67e74705SXin Li//===----------------------------------------------------------------------===// 85*67e74705SXin Li 86*67e74705SXin Li// <rdar://problem/6062730> 87*67e74705SXin Li// The analyzer doesn't perform any inter-procedural analysis, so delegates 88*67e74705SXin Li// involving [NSObject performSelector...] tend to lead to false positives. 89*67e74705SXin Li// For now the analyzer just stops tracking the reference count of the 90*67e74705SXin Li// receiver until we have better support for delegates. 91*67e74705SXin Li 92*67e74705SXin Li@interface test_6062730 : NSObject 93*67e74705SXin Li+ (void)postNotification:(NSString *)str; 94*67e74705SXin Li- (void)foo; 95*67e74705SXin Li- (void)bar; 96*67e74705SXin Li@end 97*67e74705SXin Li 98*67e74705SXin Li@implementation test_6062730 99*67e74705SXin Li- (void) foo { 100*67e74705SXin Li NSString *str = [[NSString alloc] init]; // no-warning 101*67e74705SXin Li [test_6062730 performSelectorOnMainThread:@selector(postNotification:) withObject:str waitUntilDone:1]; 102*67e74705SXin Li} 103*67e74705SXin Li 104*67e74705SXin Li- (void) bar { 105*67e74705SXin Li NSString *str = [[NSString alloc] init]; // no-warning 106*67e74705SXin Li [[self class] performSelectorOnMainThread:@selector(postNotification:) withObject:str waitUntilDone:1]; 107*67e74705SXin Li} 108*67e74705SXin Li 109*67e74705SXin Li+ (void) postNotification:(NSString *)str { 110*67e74705SXin Li [str release]; // no-warning 111*67e74705SXin Li} 112*67e74705SXin Li@end 113*67e74705SXin Li 114*67e74705SXin Li 115*67e74705SXin Li@interface ObjectThatRequiresDelegate : NSObject 116*67e74705SXin Li- (id)initWithDelegate:(id)delegate; 117*67e74705SXin Li- (id)initWithNumber:(int)num delegate:(id)delegate; 118*67e74705SXin Li@end 119*67e74705SXin Li 120*67e74705SXin Li 121*67e74705SXin Li@interface DelegateRequirerTest 122*67e74705SXin Li@end 123*67e74705SXin Li@implementation DelegateRequirerTest 124*67e74705SXin Li 125*67e74705SXin Li- (void)test { 126*67e74705SXin Li (void)[[ObjectThatRequiresDelegate alloc] initWithDelegate:self]; 127*67e74705SXin Li (void)[[ObjectThatRequiresDelegate alloc] initWithNumber:0 delegate:self]; 128*67e74705SXin Li // no leak warnings -- these objects could be released in callback methods 129*67e74705SXin Li} 130*67e74705SXin Li 131*67e74705SXin Li@end 132