// RUN: %clang_analyze_cc1 -analyzer-checker=core,osx.cocoa.RetainCount,alpha.core -analyzer-config ipa=none -analyzer-store=region -verify %s typedef const struct __CFString * CFStringRef; typedef const struct __CFAllocator * CFAllocatorRef; typedef const struct __CFURL * CFURLRef; extern CFURLRef CFURLCreateWithString(CFAllocatorRef allocator, CFStringRef URLString, CFURLRef baseURL); typedef signed char BOOL; @protocol NSObject - (BOOL)isEqual:(id)object; @end @interface NSObject {} @end @class NSArray, NSString, NSURL; @interface NamingTest : NSObject {} -(NSObject*)copyPhoto; -(NSObject*)mutableCopyPhoto; -(NSObject*)mutable; -(NSObject*)mutableCopying; -(NSObject*)photocopy; // read as "photocopy" -(NSObject*)photoCopy; // read as "photo Copy" -(NSObject*)__blebPRCopy; // read as "bleb PRCopy" -(NSObject*)__blebPRcopy; // read as "bleb P Rcopy" -(NSObject*)new_theprefixdoescount; // read as "new theprefixdoescount" -(NSObject*)newestAwesomeStuff; // read as "newest awesome stuff" @end @interface MyClass : NSObject { id myObject; } - (NSURL *)myMethod:(NSString *)inString; - (NSURL *)getMethod:(NSString*)inString; - (NSURL *)getMethod2:(NSString*)inString; - (void)addObject:(id) __attribute__((ns_consumed)) X; - (void)addObject2:(id) X; @end @implementation MyClass - (NSURL *)myMethod:(NSString *)inString { NSURL *url = (NSURL *)CFURLCreateWithString(0, (CFStringRef)inString, 0); // expected-warning{{leak}} return url; } - (NSURL *)getMethod:(NSString *)inString { NSURL *url = (NSURL *)CFURLCreateWithString(0, (CFStringRef)inString, 0); [self addObject:url]; return url; // no-warning } - (NSURL *)getMethod2:(NSString *)inString { NSURL *url = (NSURL *)CFURLCreateWithString(0, (CFStringRef)inString, 0); // expected-warning{{leak}} [self addObject2:url]; return url; } void testNames(NamingTest* x) { [x copyPhoto]; // expected-warning{{leak}} [x mutableCopyPhoto]; // expected-warning{{leak}} [x mutable]; // no-warning [x mutableCopying]; // no-warning [x photocopy]; // no-warning [x photoCopy]; // no-warning [x __blebPRCopy]; // no-warning [x __blebPRcopy]; // no-warning [x new_theprefixdoescount]; // expected-warning{{leak}} [x newestAwesomeStuff]; // no-warning } - (void)addObject:(id)X { myObject = X; } - (void)addObject2:(id)X { myObject = X; } @end