1*67e74705SXin Li// RUN: %clang_cc1 -triple %itanium_abi_triple -analyze -analyzer-checker=core,osx.cocoa.RetainCount,osx.cocoa.NSAutoreleasePool -analyzer-store=region -fobjc-gc-only -fblocks -verify -Wno-objc-root-class %s 2*67e74705SXin Li 3*67e74705SXin Li//===----------------------------------------------------------------------===// 4*67e74705SXin Li// Header stuff. 5*67e74705SXin Li//===----------------------------------------------------------------------===// 6*67e74705SXin Li 7*67e74705SXin Litypedef unsigned int __darwin_natural_t; 8*67e74705SXin Litypedef unsigned long uintptr_t; 9*67e74705SXin Litypedef unsigned int uint32_t; 10*67e74705SXin Litypedef unsigned long long uint64_t; 11*67e74705SXin Litypedef unsigned int UInt32; 12*67e74705SXin Litypedef signed long CFIndex; 13*67e74705SXin Litypedef struct { 14*67e74705SXin Li CFIndex location; 15*67e74705SXin Li CFIndex length; 16*67e74705SXin Li} CFRange; 17*67e74705SXin Listatic __inline__ __attribute__((always_inline)) CFRange CFRangeMake(CFIndex loc, CFIndex len) { 18*67e74705SXin Li CFRange range; 19*67e74705SXin Li range.location = loc; 20*67e74705SXin Li range.length = len; 21*67e74705SXin Li return range; 22*67e74705SXin Li} 23*67e74705SXin Litypedef const void * CFTypeRef; 24*67e74705SXin Litypedef const struct __CFString * CFStringRef; 25*67e74705SXin Litypedef const struct __CFAllocator * CFAllocatorRef; 26*67e74705SXin Liextern const CFAllocatorRef kCFAllocatorDefault; 27*67e74705SXin Liextern CFTypeRef CFRetain(CFTypeRef cf); 28*67e74705SXin Liextern void CFRelease(CFTypeRef cf); 29*67e74705SXin Litypedef struct { 30*67e74705SXin Li} 31*67e74705SXin LiCFArrayCallBacks; 32*67e74705SXin Liextern const CFArrayCallBacks kCFTypeArrayCallBacks; 33*67e74705SXin Litypedef const struct __CFArray * CFArrayRef; 34*67e74705SXin Litypedef struct __CFArray * CFMutableArrayRef; 35*67e74705SXin Liextern CFMutableArrayRef CFArrayCreateMutable(CFAllocatorRef allocator, CFIndex capacity, const CFArrayCallBacks *callBacks); 36*67e74705SXin Liextern const void *CFArrayGetValueAtIndex(CFArrayRef theArray, CFIndex idx); 37*67e74705SXin Liextern void CFArrayAppendValue(CFMutableArrayRef theArray, const void *value); 38*67e74705SXin Litypedef struct { 39*67e74705SXin Li} 40*67e74705SXin LiCFDictionaryKeyCallBacks; 41*67e74705SXin Liextern const CFDictionaryKeyCallBacks kCFTypeDictionaryKeyCallBacks; 42*67e74705SXin Litypedef struct { 43*67e74705SXin Li} 44*67e74705SXin LiCFDictionaryValueCallBacks; 45*67e74705SXin Liextern const CFDictionaryValueCallBacks kCFTypeDictionaryValueCallBacks; 46*67e74705SXin Litypedef const struct __CFDictionary * CFDictionaryRef; 47*67e74705SXin Litypedef struct __CFDictionary * CFMutableDictionaryRef; 48*67e74705SXin Liextern CFMutableDictionaryRef CFDictionaryCreateMutable(CFAllocatorRef allocator, CFIndex capacity, const CFDictionaryKeyCallBacks *keyCallBacks, const CFDictionaryValueCallBacks *valueCallBacks); 49*67e74705SXin Litypedef UInt32 CFStringEncoding; 50*67e74705SXin Lienum { 51*67e74705SXin LikCFStringEncodingMacRoman = 0, kCFStringEncodingWindowsLatin1 = 0x0500, kCFStringEncodingISOLatin1 = 0x0201, kCFStringEncodingNextStepLatin = 0x0B01, kCFStringEncodingASCII = 0x0600, kCFStringEncodingUnicode = 0x0100, kCFStringEncodingUTF8 = 0x08000100, kCFStringEncodingNonLossyASCII = 0x0BFF , kCFStringEncodingUTF16 = 0x0100, kCFStringEncodingUTF16BE = 0x10000100, kCFStringEncodingUTF16LE = 0x14000100, kCFStringEncodingUTF32 = 0x0c000100, kCFStringEncodingUTF32BE = 0x18000100, kCFStringEncodingUTF32LE = 0x1c000100 }; 52*67e74705SXin Liextern CFStringRef CFStringCreateWithCString(CFAllocatorRef alloc, const char *cStr, CFStringEncoding encoding); 53*67e74705SXin Litypedef double CFTimeInterval; 54*67e74705SXin Litypedef CFTimeInterval CFAbsoluteTime; 55*67e74705SXin Liextern CFAbsoluteTime CFAbsoluteTimeGetCurrent(void); 56*67e74705SXin Litypedef const struct __CFDate * CFDateRef; 57*67e74705SXin Liextern CFDateRef CFDateCreate(CFAllocatorRef allocator, CFAbsoluteTime at); 58*67e74705SXin Liextern CFAbsoluteTime CFDateGetAbsoluteTime(CFDateRef theDate); 59*67e74705SXin Litypedef __darwin_natural_t natural_t; 60*67e74705SXin Litypedef natural_t mach_port_name_t; 61*67e74705SXin Litypedef mach_port_name_t mach_port_t; 62*67e74705SXin Litypedef int kern_return_t; 63*67e74705SXin Litypedef kern_return_t mach_error_t; 64*67e74705SXin Lienum { 65*67e74705SXin LikCFNumberSInt8Type = 1, kCFNumberSInt16Type = 2, kCFNumberSInt32Type = 3, kCFNumberSInt64Type = 4, kCFNumberFloat32Type = 5, kCFNumberFloat64Type = 6, kCFNumberCharType = 7, kCFNumberShortType = 8, kCFNumberIntType = 9, kCFNumberLongType = 10, kCFNumberLongLongType = 11, kCFNumberFloatType = 12, kCFNumberDoubleType = 13, kCFNumberCFIndexType = 14, kCFNumberNSIntegerType = 15, kCFNumberCGFloatType = 16, kCFNumberMaxType = 16 }; 66*67e74705SXin Litypedef CFIndex CFNumberType; 67*67e74705SXin Litypedef const struct __CFNumber * CFNumberRef; 68*67e74705SXin Liextern CFNumberRef CFNumberCreate(CFAllocatorRef allocator, CFNumberType theType, const void *valuePtr); 69*67e74705SXin Litypedef const struct __CFAttributedString *CFAttributedStringRef; 70*67e74705SXin Litypedef struct __CFAttributedString *CFMutableAttributedStringRef; 71*67e74705SXin Liextern CFAttributedStringRef CFAttributedStringCreate(CFAllocatorRef alloc, CFStringRef str, CFDictionaryRef attributes) ; 72*67e74705SXin Liextern CFMutableAttributedStringRef CFAttributedStringCreateMutableCopy(CFAllocatorRef alloc, CFIndex maxLength, CFAttributedStringRef aStr) ; 73*67e74705SXin Liextern void CFAttributedStringSetAttribute(CFMutableAttributedStringRef aStr, CFRange range, CFStringRef attrName, CFTypeRef value) ; 74*67e74705SXin Litypedef signed char BOOL; 75*67e74705SXin Litypedef unsigned long NSUInteger; 76*67e74705SXin Li@class NSString, Protocol; 77*67e74705SXin Liextern void NSLog(NSString *format, ...) __attribute__((format(__NSString__, 1, 2))); 78*67e74705SXin Litypedef struct _NSZone NSZone; 79*67e74705SXin Li@class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator; 80*67e74705SXin Li@protocol NSObject 81*67e74705SXin Li- (BOOL)isEqual:(id)object; 82*67e74705SXin Li- (id)retain; 83*67e74705SXin Li- (oneway void)release; 84*67e74705SXin Li- (id)autorelease; 85*67e74705SXin Li- (Class)class; 86*67e74705SXin Li@end @protocol NSCopying - (id)copyWithZone:(NSZone *)zone; 87*67e74705SXin Li@end @protocol NSMutableCopying - (id)mutableCopyWithZone:(NSZone *)zone; 88*67e74705SXin Li@end @protocol NSCoding - (void)encodeWithCoder:(NSCoder *)aCoder; 89*67e74705SXin Li@end 90*67e74705SXin Li@interface NSObject <NSObject> {} 91*67e74705SXin Li+ (id)allocWithZone:(NSZone *)zone; 92*67e74705SXin Li+ (id)alloc; 93*67e74705SXin Li- (void)dealloc; 94*67e74705SXin Li- (oneway void)release; 95*67e74705SXin Li- (id)copy; 96*67e74705SXin Li@end 97*67e74705SXin Li@interface NSObject (NSCoderMethods) 98*67e74705SXin Li- (id)awakeAfterUsingCoder:(NSCoder *)aDecoder; 99*67e74705SXin Li@end 100*67e74705SXin Liextern id NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone); 101*67e74705SXin Litypedef struct { 102*67e74705SXin Li} 103*67e74705SXin LiNSFastEnumerationState; 104*67e74705SXin Li@protocol NSFastEnumeration - (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len; 105*67e74705SXin Li@end @class NSString, NSDictionary; 106*67e74705SXin Li@interface NSValue : NSObject <NSCopying, NSCoding> - (void)getValue:(void *)value; 107*67e74705SXin Li@end @interface NSNumber : NSValue - (char)charValue; 108*67e74705SXin Li- (id)initWithInt:(int)value; 109*67e74705SXin Li@end @class NSString; 110*67e74705SXin Li@interface NSArray : NSObject <NSCopying, NSMutableCopying, NSCoding, NSFastEnumeration> 111*67e74705SXin Li- (NSUInteger)count; 112*67e74705SXin Li@end 113*67e74705SXin Li@interface NSArray (NSArrayCreation) 114*67e74705SXin Li+ (id)array; 115*67e74705SXin Li+ (id)arrayWithObjects:(const id [])objects count:(NSUInteger)cnt; 116*67e74705SXin Li@end 117*67e74705SXin Li @interface NSAutoreleasePool : NSObject { 118*67e74705SXin Li} 119*67e74705SXin Li- (void)drain; 120*67e74705SXin Li- (id)init; 121*67e74705SXin Li@end extern NSString * const NSBundleDidLoadNotification; 122*67e74705SXin Litypedef double NSTimeInterval; 123*67e74705SXin Li@interface NSDate : NSObject <NSCopying, NSCoding> - (NSTimeInterval)timeIntervalSinceReferenceDate; 124*67e74705SXin Li@end typedef unsigned short unichar; 125*67e74705SXin Li@interface NSString : NSObject <NSCopying, NSMutableCopying, NSCoding> - (NSUInteger)length; 126*67e74705SXin Li- ( const char *)UTF8String; 127*67e74705SXin Li- (id)initWithUTF8String:(const char *)nullTerminatedCString; 128*67e74705SXin Li+ (id)stringWithUTF8String:(const char *)nullTerminatedCString; 129*67e74705SXin Li@end @class NSString, NSURL, NSError; 130*67e74705SXin Li@interface NSData : NSObject <NSCopying, NSMutableCopying, NSCoding> - (NSUInteger)length; 131*67e74705SXin Li+ (id)dataWithBytesNoCopy:(void *)bytes length:(NSUInteger)length; 132*67e74705SXin Li+ (id)dataWithBytesNoCopy:(void *)bytes length:(NSUInteger)length freeWhenDone:(BOOL)b; 133*67e74705SXin Li@end @class NSLocale, NSDate, NSCalendar, NSTimeZone, NSError, NSArray, NSMutableDictionary; 134*67e74705SXin Li@interface NSDictionary : NSObject <NSCopying, NSMutableCopying, NSCoding, NSFastEnumeration> - (NSUInteger)count; 135*67e74705SXin Li@end @interface NSMutableDictionary : NSDictionary - (void)removeObjectForKey:(id)aKey; 136*67e74705SXin Li- (void)setObject:(id)anObject forKey:(id)aKey; 137*67e74705SXin Li@end @interface NSMutableDictionary (NSMutableDictionaryCreation) + (id)dictionaryWithCapacity:(NSUInteger)numItems; 138*67e74705SXin Li@end typedef double CGFloat; 139*67e74705SXin Listruct CGSize { 140*67e74705SXin Li}; 141*67e74705SXin Litypedef struct CGSize CGSize; 142*67e74705SXin Listruct CGRect { 143*67e74705SXin Li}; 144*67e74705SXin Litypedef struct CGRect CGRect; 145*67e74705SXin Litypedef mach_port_t io_object_t; 146*67e74705SXin Litypedef char io_name_t[128]; 147*67e74705SXin Litypedef io_object_t io_iterator_t; 148*67e74705SXin Litypedef io_object_t io_service_t; 149*67e74705SXin Litypedef struct IONotificationPort * IONotificationPortRef; 150*67e74705SXin Litypedef void (*IOServiceMatchingCallback)( void * refcon, io_iterator_t iterator ); 151*67e74705SXin Liio_service_t IOServiceGetMatchingService( mach_port_t masterPort, CFDictionaryRef matching ); 152*67e74705SXin Likern_return_t IOServiceGetMatchingServices( mach_port_t masterPort, CFDictionaryRef matching, io_iterator_t * existing ); 153*67e74705SXin Likern_return_t IOServiceAddNotification( mach_port_t masterPort, const io_name_t notificationType, CFDictionaryRef matching, mach_port_t wakePort, uintptr_t reference, io_iterator_t * notification ) __attribute__((deprecated)); 154*67e74705SXin Likern_return_t IOServiceAddMatchingNotification( IONotificationPortRef notifyPort, const io_name_t notificationType, CFDictionaryRef matching, IOServiceMatchingCallback callback, void * refCon, io_iterator_t * notification ); 155*67e74705SXin LiCFMutableDictionaryRef IOServiceMatching( const char * name ); 156*67e74705SXin LiCFMutableDictionaryRef IOServiceNameMatching( const char * name ); 157*67e74705SXin LiCFMutableDictionaryRef IOBSDNameMatching( mach_port_t masterPort, uint32_t options, const char * bsdName ); 158*67e74705SXin LiCFMutableDictionaryRef IOOpenFirmwarePathMatching( mach_port_t masterPort, uint32_t options, const char * path ); 159*67e74705SXin LiCFMutableDictionaryRef IORegistryEntryIDMatching( uint64_t entryID ); 160*67e74705SXin Litypedef struct __DASession * DASessionRef; 161*67e74705SXin Liextern DASessionRef DASessionCreate( CFAllocatorRef allocator ); 162*67e74705SXin Litypedef struct __DADisk * DADiskRef; 163*67e74705SXin Liextern DADiskRef DADiskCreateFromBSDName( CFAllocatorRef allocator, DASessionRef session, const char * name ); 164*67e74705SXin Liextern DADiskRef DADiskCreateFromIOMedia( CFAllocatorRef allocator, DASessionRef session, io_service_t media ); 165*67e74705SXin Liextern CFDictionaryRef DADiskCopyDescription( DADiskRef disk ); 166*67e74705SXin Liextern DADiskRef DADiskCopyWholeDisk( DADiskRef disk ); 167*67e74705SXin Li@interface NSTask : NSObject - (id)init; 168*67e74705SXin Li@end typedef struct CGColorSpace *CGColorSpaceRef; 169*67e74705SXin Litypedef struct CGImage *CGImageRef; 170*67e74705SXin Litypedef struct CGLayer *CGLayerRef; 171*67e74705SXin Li@interface NSResponder : NSObject <NSCoding> { 172*67e74705SXin Li} 173*67e74705SXin Li@end @protocol NSAnimatablePropertyContainer - (id)animator; 174*67e74705SXin Li@end extern NSString *NSAnimationTriggerOrderIn ; 175*67e74705SXin Li@interface NSView : NSResponder <NSAnimatablePropertyContainer> { 176*67e74705SXin Li} 177*67e74705SXin Li@end @protocol NSValidatedUserInterfaceItem - (SEL)action; 178*67e74705SXin Li@end @protocol NSUserInterfaceValidations - (BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)anItem; 179*67e74705SXin Li@end @class NSDate, NSDictionary, NSError, NSException, NSNotification; 180*67e74705SXin Li@interface NSApplication : NSResponder <NSUserInterfaceValidations> { 181*67e74705SXin Li} 182*67e74705SXin Li@end enum { 183*67e74705SXin LiNSTerminateCancel = 0, NSTerminateNow = 1, NSTerminateLater = 2 }; 184*67e74705SXin Litypedef NSUInteger NSApplicationTerminateReply; 185*67e74705SXin Li@protocol NSApplicationDelegate <NSObject> @optional - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender; 186*67e74705SXin Li@end @class NSAttributedString, NSEvent, NSFont, NSFormatter, NSImage, NSMenu, NSText, NSView, NSTextView; 187*67e74705SXin Li@interface NSCell : NSObject <NSCopying, NSCoding> { 188*67e74705SXin Li} 189*67e74705SXin Li@end @class NSTextField, NSPanel, NSArray, NSWindow, NSImage, NSButton, NSError; 190*67e74705SXin Litypedef struct { 191*67e74705SXin Li} 192*67e74705SXin LiCVTimeStamp; 193*67e74705SXin Li@interface CIImage : NSObject <NSCoding, NSCopying> { 194*67e74705SXin Li} 195*67e74705SXin Litypedef int CIFormat; 196*67e74705SXin Li@end enum { 197*67e74705SXin LikDAReturnSuccess = 0, kDAReturnError = (((0x3eU)&0x3f)<<26) | (((0x368)&0xfff)<<14) | 0x01, kDAReturnBusy = (((0x3eU)&0x3f)<<26) | (((0x368)&0xfff)<<14) | 0x02, kDAReturnBadArgument = (((0x3eU)&0x3f)<<26) | (((0x368)&0xfff)<<14) | 0x03, kDAReturnExclusiveAccess = (((0x3eU)&0x3f)<<26) | (((0x368)&0xfff)<<14) | 0x04, kDAReturnNoResources = (((0x3eU)&0x3f)<<26) | (((0x368)&0xfff)<<14) | 0x05, kDAReturnNotFound = (((0x3eU)&0x3f)<<26) | (((0x368)&0xfff)<<14) | 0x06, kDAReturnNotMounted = (((0x3eU)&0x3f)<<26) | (((0x368)&0xfff)<<14) | 0x07, kDAReturnNotPermitted = (((0x3eU)&0x3f)<<26) | (((0x368)&0xfff)<<14) | 0x08, kDAReturnNotPrivileged = (((0x3eU)&0x3f)<<26) | (((0x368)&0xfff)<<14) | 0x09, kDAReturnNotReady = (((0x3eU)&0x3f)<<26) | (((0x368)&0xfff)<<14) | 0x0A, kDAReturnNotWritable = (((0x3eU)&0x3f)<<26) | (((0x368)&0xfff)<<14) | 0x0B, kDAReturnUnsupported = (((0x3eU)&0x3f)<<26) | (((0x368)&0xfff)<<14) | 0x0C }; 198*67e74705SXin Litypedef mach_error_t DAReturn; 199*67e74705SXin Litypedef const struct __DADissenter * DADissenterRef; 200*67e74705SXin Liextern DADissenterRef DADissenterCreate( CFAllocatorRef allocator, DAReturn status, CFStringRef string ); 201*67e74705SXin Li@interface CIContext: NSObject { 202*67e74705SXin Li} 203*67e74705SXin Li- (CGImageRef)createCGImage:(CIImage *)im fromRect:(CGRect)r; 204*67e74705SXin Li- (CGImageRef)createCGImage:(CIImage *)im fromRect:(CGRect)r format:(CIFormat)f colorSpace:(CGColorSpaceRef)cs; 205*67e74705SXin Li- (CGLayerRef)createCGLayerWithSize:(CGSize)size info:(CFDictionaryRef)d; 206*67e74705SXin Li@end extern NSString* const QCRendererEventKey; 207*67e74705SXin Li@protocol QCCompositionRenderer - (NSDictionary*) attributes; 208*67e74705SXin Li@end @interface QCRenderer : NSObject <QCCompositionRenderer> { 209*67e74705SXin Li} 210*67e74705SXin Li- (id) createSnapshotImageOfType:(NSString*)type; 211*67e74705SXin Li@end extern NSString* const QCViewDidStartRenderingNotification; 212*67e74705SXin Li@interface QCView : NSView <QCCompositionRenderer> { 213*67e74705SXin Li} 214*67e74705SXin Li- (id) createSnapshotImageOfType:(NSString*)type; 215*67e74705SXin Li@end enum { 216*67e74705SXin LiICEXIFOrientation1 = 1, ICEXIFOrientation2 = 2, ICEXIFOrientation3 = 3, ICEXIFOrientation4 = 4, ICEXIFOrientation5 = 5, ICEXIFOrientation6 = 6, ICEXIFOrientation7 = 7, ICEXIFOrientation8 = 8, }; 217*67e74705SXin Li@class ICDevice; 218*67e74705SXin Li@protocol ICDeviceDelegate <NSObject> @required - (void)didRemoveDevice:(ICDevice*)device; 219*67e74705SXin Li@end extern NSString *const ICScannerStatusWarmingUp; 220*67e74705SXin Li@class ICScannerDevice; 221*67e74705SXin Li@protocol ICScannerDeviceDelegate <ICDeviceDelegate> @optional - (void)scannerDeviceDidBecomeAvailable:(ICScannerDevice*)scanner; 222*67e74705SXin Li@end 223*67e74705SXin LiCFTypeRef CFMakeCollectable(CFTypeRef cf) ; 224*67e74705SXin Li 225*67e74705SXin Listatic __inline__ __attribute__((always_inline)) id NSMakeCollectable(CFTypeRef 226*67e74705SXin Licf) { 227*67e74705SXin Li return cf ? (id)CFMakeCollectable(cf) : ((void*)0); 228*67e74705SXin Li} 229*67e74705SXin Li 230*67e74705SXin Li//===----------------------------------------------------------------------===// 231*67e74705SXin Li// Test cases. 232*67e74705SXin Li//===----------------------------------------------------------------------===// 233*67e74705SXin Li 234*67e74705SXin Livoid f1() { 235*67e74705SXin Li CFMutableArrayRef A = CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // no-warning 236*67e74705SXin Li id x = [(id) A autorelease]; 237*67e74705SXin Li CFRelease((CFMutableArrayRef) x); 238*67e74705SXin Li} 239*67e74705SXin Li 240*67e74705SXin Livoid f2() { 241*67e74705SXin Li CFMutableArrayRef A = CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // expected-warning{{leak}} 242*67e74705SXin Li id x = [(id) A retain]; 243*67e74705SXin Li [x release]; 244*67e74705SXin Li [x release]; 245*67e74705SXin Li} 246*67e74705SXin Li 247*67e74705SXin Livoid f3() { 248*67e74705SXin Li CFMutableArrayRef A = CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // expected-warning{{leak}} 249*67e74705SXin Li CFMakeCollectable(A); 250*67e74705SXin Li CFRetain(A); 251*67e74705SXin Li} 252*67e74705SXin Li 253*67e74705SXin Livoid f3b() { 254*67e74705SXin Li CFMutableArrayRef A = CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // no-warning 255*67e74705SXin Li CFMakeCollectable(A); 256*67e74705SXin Li} 257*67e74705SXin Li 258*67e74705SXin Li 259*67e74705SXin Livoid f4() { 260*67e74705SXin Li CFMutableArrayRef A = CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // expected-warning{{leak}} 261*67e74705SXin Li NSMakeCollectable(A); 262*67e74705SXin Li CFRetain(A); 263*67e74705SXin Li} 264*67e74705SXin Li 265*67e74705SXin Livoid f4b() { 266*67e74705SXin Li CFMutableArrayRef A = CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // no-warning 267*67e74705SXin Li NSMakeCollectable(A); 268*67e74705SXin Li} 269*67e74705SXin Li 270*67e74705SXin Livoid f5() { 271*67e74705SXin Li id x = [NSMakeCollectable(CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks)) autorelease]; // no-warning 272*67e74705SXin Li} 273*67e74705SXin Li 274*67e74705SXin Livoid f5b() { 275*67e74705SXin Li id x = [(id) CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks) autorelease]; // expected-warning{{leak}} 276*67e74705SXin Li} 277*67e74705SXin Li 278*67e74705SXin Li// Test return of non-owned objects in contexts where an owned object 279*67e74705SXin Li// is expected. 280*67e74705SXin Li@interface TestReturnNotOwnedWhenExpectedOwned 281*67e74705SXin Li- (NSString*)newString; 282*67e74705SXin Li- (CFMutableArrayRef)newArray; 283*67e74705SXin Li@end 284*67e74705SXin Li 285*67e74705SXin Li@implementation TestReturnNotOwnedWhenExpectedOwned 286*67e74705SXin Li- (NSString*)newString { 287*67e74705SXin Li NSString *s = [NSString stringWithUTF8String:"hello"]; // expected-warning{{Potential leak (when using garbage collection) of an object}} 288*67e74705SXin Li CFRetain(s); 289*67e74705SXin Li return s; 290*67e74705SXin Li} 291*67e74705SXin Li- (CFMutableArrayRef)newArray{ 292*67e74705SXin Li return CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // no-warning 293*67e74705SXin Li} 294*67e74705SXin Li@end 295*67e74705SXin Li 296*67e74705SXin Li//===----------------------------------------------------------------------===// 297*67e74705SXin Li// <rdar://problem/6948053> False positive: object substitution during -init* 298*67e74705SXin Li// methods warns about returning +0 when using -fobjc-gc-only 299*67e74705SXin Li//===----------------------------------------------------------------------===// 300*67e74705SXin Li 301*67e74705SXin Li@interface MyClassRdar6948053 : NSObject 302*67e74705SXin Li- (id) init; 303*67e74705SXin Li+ (id) shared; 304*67e74705SXin Li@end 305*67e74705SXin Li 306*67e74705SXin Li@implementation MyClassRdar6948053 307*67e74705SXin Li+(id) shared { 308*67e74705SXin Li return (id) 0; 309*67e74705SXin Li} 310*67e74705SXin Li- (id) init 311*67e74705SXin Li{ 312*67e74705SXin Li Class myClass = [self class]; 313*67e74705SXin Li [self release]; 314*67e74705SXin Li return [[myClass shared] retain]; // no-warning 315*67e74705SXin Li} 316*67e74705SXin Li@end 317*67e74705SXin Li 318*67e74705SXin Li//===----------------------------------------------------------------------===// 319*67e74705SXin Li// <rdar://problem/7174400> 'ciContext createCGImage:outputImage fromRect:' returns a retained CF object (not GC'ed)//===----------------------------------------------------------------------===// 320*67e74705SXin Li//===----------------------------------------------------------------------===// 321*67e74705SXin Li 322*67e74705SXin Livoid rdar_7174400(QCView *view, QCRenderer *renderer, CIContext *context, 323*67e74705SXin Li NSString *str, CIImage *img, CGRect rect, 324*67e74705SXin Li CIFormat form, CGColorSpaceRef cs) { 325*67e74705SXin Li [view createSnapshotImageOfType:str]; // no-warning 326*67e74705SXin Li [renderer createSnapshotImageOfType:str]; // no-warning 327*67e74705SXin Li [context createCGImage:img fromRect:rect]; // expected-warning{{leak}} 328*67e74705SXin Li [context createCGImage:img fromRect:rect format:form colorSpace:cs]; // expected-warning{{leak}} 329*67e74705SXin Li} 330*67e74705SXin Li 331*67e74705SXin Li//===----------------------------------------------------------------------===// 332*67e74705SXin Li// <rdar://problem/6250216> Warn against using -[NSAutoreleasePool release] in 333*67e74705SXin Li// GC mode 334*67e74705SXin Li//===----------------------------------------------------------------------===// 335*67e74705SXin Li 336*67e74705SXin Livoid rdar_6250216(void) { 337*67e74705SXin Li NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 338*67e74705SXin Li [pool release]; // expected-warning{{Use -drain instead of -release when using NSAutoreleasePool and garbage collection}} 339*67e74705SXin Li} 340*67e74705SXin Li 341*67e74705SXin Li 342*67e74705SXin Li//===----------------------------------------------------------------------===// 343*67e74705SXin Li// <rdar://problem/7407273> Don't crash when analyzing messages sent to blocks 344*67e74705SXin Li//===----------------------------------------------------------------------===// 345*67e74705SXin Li 346*67e74705SXin Li@class RDar7407273; 347*67e74705SXin Litypedef void (^RDar7407273Block)(RDar7407273 *operation); 348*67e74705SXin Livoid rdar7407273(RDar7407273Block b) { 349*67e74705SXin Li [b copy]; 350*67e74705SXin Li} 351*67e74705SXin Li 352*67e74705SXin Li//===----------------------------------------------------------------------===// 353*67e74705SXin Li// Tests of ownership attributes. 354*67e74705SXin Li//===----------------------------------------------------------------------===// 355*67e74705SXin Li 356*67e74705SXin Li@interface TestOwnershipAttr : NSObject 357*67e74705SXin Li- (NSString*) returnsAnOwnedString __attribute__((ns_returns_retained)); 358*67e74705SXin Li- (NSString*) returnsAnOwnedCFString __attribute__((cf_returns_retained)); 359*67e74705SXin Li@end 360*67e74705SXin Li 361*67e74705SXin Livoid test_attr_1(TestOwnershipAttr *X) { 362*67e74705SXin Li NSString *str = [X returnsAnOwnedString]; // no-warning 363*67e74705SXin Li} 364*67e74705SXin Li 365*67e74705SXin Livoid test_attr_1b(TestOwnershipAttr *X) { 366*67e74705SXin Li NSString *str = [X returnsAnOwnedCFString]; // expected-warning{{leak}} 367*67e74705SXin Li} 368*67e74705SXin Li 369*67e74705SXin Li@interface MyClassTestCFAttr : NSObject {} 370*67e74705SXin Li- (NSDate*) returnsCFRetained __attribute__((cf_returns_retained)); 371*67e74705SXin Li- (NSDate*) alsoReturnsRetained; 372*67e74705SXin Li- (NSDate*) returnsNSRetained __attribute__((ns_returns_retained)); 373*67e74705SXin Li@end 374*67e74705SXin Li 375*67e74705SXin Li__attribute__((cf_returns_retained)) 376*67e74705SXin LiCFDateRef returnsRetainedCFDate() { 377*67e74705SXin Li return CFDateCreate(0, CFAbsoluteTimeGetCurrent()); 378*67e74705SXin Li} 379*67e74705SXin Li 380*67e74705SXin Li@implementation MyClassTestCFAttr 381*67e74705SXin Li- (NSDate*) returnsCFRetained { 382*67e74705SXin Li return (NSDate*) returnsRetainedCFDate(); // No leak. 383*67e74705SXin Li} 384*67e74705SXin Li 385*67e74705SXin Li- (NSDate*) alsoReturnsRetained { 386*67e74705SXin Li return (NSDate*) returnsRetainedCFDate(); // expected-warning{{leak}} 387*67e74705SXin Li} 388*67e74705SXin Li 389*67e74705SXin Li- (NSDate*) returnsNSRetained { 390*67e74705SXin Li return (NSDate*) returnsRetainedCFDate(); // expected-warning{{leak}} 391*67e74705SXin Li} 392*67e74705SXin Li@end 393*67e74705SXin Li 394*67e74705SXin Li 395*67e74705SXin Li#if __has_feature(attribute_ns_consumed) 396*67e74705SXin Li#define NS_CONSUMED __attribute__((ns_consumed)) 397*67e74705SXin Li#endif 398*67e74705SXin Li#if __has_feature(attribute_cf_consumed) 399*67e74705SXin Li#define CF_CONSUMED __attribute__((cf_consumed)) 400*67e74705SXin Li#endif 401*67e74705SXin Li 402*67e74705SXin Livoid consumeAndStopTracking(id NS_CONSUMED obj, void (^callback)(void)); 403*67e74705SXin Livoid CFConsumeAndStopTracking(CFTypeRef CF_CONSUMED obj, void (^callback)(void)); 404*67e74705SXin Li 405*67e74705SXin Livoid testConsumeAndStopTracking() { 406*67e74705SXin Li id retained = [@[] retain]; // +0, GC 407*67e74705SXin Li consumeAndStopTracking(retained, ^{}); // no-warning 408*67e74705SXin Li 409*67e74705SXin Li id doubleRetained = [[@[] retain] retain]; // +0, GC 410*67e74705SXin Li consumeAndStopTracking(doubleRetained, ^{ 411*67e74705SXin Li [doubleRetained release]; 412*67e74705SXin Li }); // no-warning 413*67e74705SXin Li 414*67e74705SXin Li id unretained = @[]; // +0 415*67e74705SXin Li consumeAndStopTracking(unretained, ^{}); // no-warning, GC 416*67e74705SXin Li} 417*67e74705SXin Li 418*67e74705SXin Livoid testCFConsumeAndStopTrackingMsg() { 419*67e74705SXin Li id retained = [@[] retain]; // +0, GC 420*67e74705SXin Li CFConsumeAndStopTracking((CFTypeRef)retained, ^{}); // expected-warning {{Incorrect decrement of the reference count of an object that is not owned at this point by the caller}} 421*67e74705SXin Li} 422*67e74705SXin Li 423*67e74705SXin Livoid testCFConsumeAndStopTracking() { 424*67e74705SXin Li CFTypeRef retained = returnsRetainedCFDate(); // +1 425*67e74705SXin Li CFConsumeAndStopTracking(retained, ^{}); // no-warning 426*67e74705SXin Li 427*67e74705SXin Li CFTypeRef doubleRetained = CFRetain(returnsRetainedCFDate()); // +2 428*67e74705SXin Li CFConsumeAndStopTracking(doubleRetained, ^{ 429*67e74705SXin Li CFRelease(doubleRetained); 430*67e74705SXin Li }); // no-warning 431*67e74705SXin Li 432*67e74705SXin Li id unretained = @[]; // +0 433*67e74705SXin Li CFConsumeAndStopTracking((CFTypeRef)unretained, ^{}); // expected-warning {{Incorrect decrement of the reference count of an object that is not owned at this point by the caller}} 434*67e74705SXin Li} 435