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