1*67e74705SXin Li// RUN: %clang_cc1 -triple %itanium_abi_triple -analyze -analyzer-checker=core,osx.cocoa.RetainCount,alpha.core -analyzer-constraints=range -analyzer-store=region -fobjc-gc -verify %s 2*67e74705SXin Li 3*67e74705SXin Litypedef const void * CFTypeRef; 4*67e74705SXin Litypedef const struct __CFString * CFStringRef; 5*67e74705SXin Litypedef const struct __CFAllocator * CFAllocatorRef; 6*67e74705SXin Litypedef const struct __CFDictionary * CFDictionaryRef; 7*67e74705SXin LiCFTypeRef CFMakeCollectable(CFTypeRef cf) ; 8*67e74705SXin Liextern CFStringRef CFStringCreateWithFormat(CFAllocatorRef alloc, CFDictionaryRef formatOptions, CFStringRef format, ...); 9*67e74705SXin Litypedef signed char BOOL; 10*67e74705SXin Litypedef unsigned int NSUInteger; 11*67e74705SXin Litypedef struct _NSZone NSZone; 12*67e74705SXin Li@class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator; 13*67e74705SXin Li@protocol NSObject 14*67e74705SXin Li- (BOOL)isEqual:(id)object; 15*67e74705SXin Li- (id)autorelease; 16*67e74705SXin Li@end 17*67e74705SXin Li@protocol NSCopying 18*67e74705SXin Li- (id)copyWithZone:(NSZone *)zone; 19*67e74705SXin Li@end @protocol NSMutableCopying 20*67e74705SXin Li- (id)mutableCopyWithZone:(NSZone *)zone; 21*67e74705SXin Li@end 22*67e74705SXin Li@protocol 23*67e74705SXin LiNSCoding 24*67e74705SXin Li- (void)encodeWithCoder:(NSCoder *)aCoder; 25*67e74705SXin Li@end 26*67e74705SXin Li@interface NSObject <NSObject> {} 27*67e74705SXin Li- (id)init; 28*67e74705SXin Li+ (id)alloc; 29*67e74705SXin Li@end 30*67e74705SXin Lienum { NSASCIIStringEncoding = 1, NSNEXTSTEPStringEncoding = 2, NSJapaneseEUCStringEncoding = 3, NSUTF8StringEncoding = 4, NSISOLatin1StringEncoding = 5, NSSymbolStringEncoding = 6, NSNonLossyASCIIStringEncoding = 7, NSShiftJISStringEncoding = 8, NSISOLatin2StringEncoding = 9, NSUnicodeStringEncoding = 10, NSWindowsCP1251StringEncoding = 11, NSWindowsCP1252StringEncoding = 12, NSWindowsCP1253StringEncoding = 13, NSWindowsCP1254StringEncoding = 14, NSWindowsCP1250StringEncoding = 15, NSISO2022JPStringEncoding = 21, NSMacOSRomanStringEncoding = 30, NSUTF16StringEncoding = NSUnicodeStringEncoding, NSUTF16BigEndianStringEncoding = 0x90000100, NSUTF16LittleEndianStringEncoding = 0x94000100, NSUTF32StringEncoding = 0x8c000100, NSUTF32BigEndianStringEncoding = 0x98000100, NSUTF32LittleEndianStringEncoding = 0x9c000100 }; 31*67e74705SXin Litypedef NSUInteger NSStringEncoding; 32*67e74705SXin Li@interface NSString : NSObject <NSCopying, NSMutableCopying, NSCoding> 33*67e74705SXin Li- (NSUInteger)length; 34*67e74705SXin Li- (id)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)len encoding:(NSStringEncoding)encoding freeWhenDone:(BOOL)freeBuffer; 35*67e74705SXin Li@end 36*67e74705SXin Li@interface NSAutoreleasePool : NSObject {} 37*67e74705SXin Li- (void)drain; 38*67e74705SXin Li@end 39*67e74705SXin Liextern NSString * const NSXMLParserErrorDomain ; 40*67e74705SXin Li 41*67e74705SXin Li// The actual test case. UTIL_AUTORELEASE_CF_AS_ID is a macro that doesn't 42*67e74705SXin Li// actually do what it was intended to. 43*67e74705SXin Li 44*67e74705SXin Li#define NSSTRINGWRAPPER(bytes,len) \ 45*67e74705SXin Li [[[NSString alloc] initWithBytesNoCopy: (void*)(bytes) length: (len) encoding: NSUTF8StringEncoding freeWhenDone: (BOOL)0] autorelease] 46*67e74705SXin Li 47*67e74705SXin Li#define UTIL_AUTORELEASE_CF_AS_ID(cf) ( (((void*)0) == (cf)) ? ((void*)0) : [(id) CFMakeCollectable( (CFTypeRef) cf) autorelease] ) 48*67e74705SXin Li 49*67e74705SXin Li#define UTIL_AUTORELEASE_CF_AS_ID_WITHOUT_TEST(cf) ( [(id) CFMakeCollectable( (CFTypeRef) cf) autorelease] ) 50*67e74705SXin Li 51*67e74705SXin Listatic char *lorem = "fooBarBaz"; 52*67e74705SXin Li 53*67e74705SXin Livoid NSLog(NSString *, ...); 54*67e74705SXin Li 55*67e74705SXin Liint main (int argc, const char * argv[]) { 56*67e74705SXin Li NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 57*67e74705SXin Li NSString *tmp1 = NSSTRINGWRAPPER(lorem, 6); // no-warning 58*67e74705SXin Li NSString *tmp2 = UTIL_AUTORELEASE_CF_AS_ID( CFStringCreateWithFormat(((void*)0), ((void*)0), ((CFStringRef) __builtin___CFStringMakeConstantString ("" "lorem: %@" "")), tmp1) ); // expected-warning 2 {{leak}} 59*67e74705SXin Li NSString *tmp3 = UTIL_AUTORELEASE_CF_AS_ID_WITHOUT_TEST( CFStringCreateWithFormat(((void*)0), ((void*)0), ((CFStringRef) __builtin___CFStringMakeConstantString ("" "lorem: %@" "")), tmp1) ); 60*67e74705SXin Li NSLog(@"tmp2: %@ tmp3: %@", tmp2, tmp3); 61*67e74705SXin Li [pool drain]; 62*67e74705SXin Li return 0; 63*67e74705SXin Li} 64