]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/ARCMT/objcmt-arc-cf-annotations.m.result
Vendor import of clang trunk r351319 (just before the release_80 branch
[FreeBSD/FreeBSD.git] / test / ARCMT / objcmt-arc-cf-annotations.m.result
1 // RUN: rm -rf %t
2 // RUN: %clang_cc1 -fblocks -objcmt-migrate-annotation -objcmt-migrate-instancetype -objcmt-migrate-readwrite-property -mt-migrate-directory %t %s -x objective-c -triple x86_64-apple-darwin11
3 // RUN: c-arcmt-test -mt-migrate-directory %t | arcmt-test -verify-transformed-files %s.result
4 // RUN: %clang_cc1 -fblocks -triple x86_64-apple-darwin10 -fsyntax-only -x objective-c %s.result
5
6 #ifndef CF_IMPLICIT_BRIDGING_ENABLED
7 #if __has_feature(arc_cf_code_audited)
8 #define CF_IMPLICIT_BRIDGING_ENABLED _Pragma("clang arc_cf_code_audited begin")
9 #else
10 #define CF_IMPLICIT_BRIDGING_ENABLED
11 #endif
12 #endif
13
14 #ifndef CF_IMPLICIT_BRIDGING_DISABLED
15 #if __has_feature(arc_cf_code_audited)
16 #define CF_IMPLICIT_BRIDGING_DISABLED _Pragma("clang arc_cf_code_audited end")
17 #else
18 #define CF_IMPLICIT_BRIDGING_DISABLED
19 #endif
20 #endif
21
22 #if __has_feature(attribute_ns_returns_retained)
23 #define NS_RETURNS_RETAINED __attribute__((ns_returns_retained))
24 #endif
25 #if __has_feature(attribute_cf_returns_retained)
26 #define CF_RETURNS_RETAINED __attribute__((cf_returns_retained))
27 #endif
28 #if __has_feature(attribute_ns_returns_not_retained)
29 #define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))
30 #endif
31 #if __has_feature(attribute_cf_returns_not_retained)
32 #define CF_RETURNS_NOT_RETAINED __attribute__((cf_returns_not_retained))
33 #endif
34 #if __has_feature(attribute_ns_consumes_self)
35 #define NS_CONSUMES_SELF __attribute__((ns_consumes_self))
36 #endif
37 #if __has_feature(attribute_ns_consumed)
38 #define NS_CONSUMED __attribute__((ns_consumed))
39 #endif
40 #if __has_feature(attribute_cf_consumed)
41 #define CF_CONSUMED __attribute__((cf_consumed))
42 #endif
43 #if __has_attribute(ns_returns_autoreleased)
44 #define NS_RETURNS_AUTORELEASED __attribute__((ns_returns_autoreleased))
45 #endif
46
47 //===----------------------------------------------------------------------===//
48 // The following code is reduced using delta-debugging from Mac OS X headers:
49 //
50 // #include <Cocoa/Cocoa.h>
51 // #include <CoreFoundation/CoreFoundation.h>
52 // #include <DiskArbitration/DiskArbitration.h>
53 // #include <QuartzCore/QuartzCore.h>
54 // #include <Quartz/Quartz.h>
55 // #include <IOKit/IOKitLib.h>
56 //
57 // It includes the basic definitions for the test cases below.
58 //===----------------------------------------------------------------------===//
59
60 typedef unsigned int __darwin_natural_t;
61 typedef unsigned long uintptr_t;
62 typedef unsigned int uint32_t;
63 typedef unsigned long long uint64_t;
64 typedef unsigned int UInt32;
65 typedef signed long CFIndex;
66 typedef CFIndex CFByteOrder;
67 typedef struct {
68     CFIndex location;
69     CFIndex length;
70 } CFRange;
71 static __inline__ __attribute__((always_inline)) CFRange CFRangeMake(CFIndex loc, CFIndex len) {
72     CFRange range;
73     range.location = loc;
74     range.length = len;
75     return range;
76 }
77 typedef const void * CFTypeRef;
78 typedef const struct __CFString * CFStringRef;
79 typedef const struct __CFAllocator * CFAllocatorRef;
80 extern const CFAllocatorRef kCFAllocatorDefault;
81 extern CFTypeRef CFRetain(CFTypeRef cf);
82
83 CF_IMPLICIT_BRIDGING_ENABLED
84
85 extern void CFRelease(CFTypeRef cf);
86
87 CF_IMPLICIT_BRIDGING_DISABLED
88
89 extern CFTypeRef CFMakeCollectable(CFTypeRef cf);
90 typedef struct {
91 }
92 CFArrayCallBacks;
93 extern const CFArrayCallBacks kCFTypeArrayCallBacks;
94 typedef const struct __CFArray * CFArrayRef;
95 typedef struct __CFArray * CFMutableArrayRef;
96 extern CFMutableArrayRef CFArrayCreateMutable(CFAllocatorRef allocator, CFIndex capacity, const CFArrayCallBacks *callBacks) CF_RETURNS_RETAINED;
97 extern const void *CFArrayGetValueAtIndex(CFArrayRef theArray, CFIndex idx) CF_RETURNS_NOT_RETAINED;
98 extern void CFArrayAppendValue(CFMutableArrayRef theArray, const void *value);
99 typedef struct {
100 }
101 CFDictionaryKeyCallBacks;
102 extern const CFDictionaryKeyCallBacks kCFTypeDictionaryKeyCallBacks;
103 typedef struct {
104 }
105 CFDictionaryValueCallBacks;
106 extern const CFDictionaryValueCallBacks kCFTypeDictionaryValueCallBacks;
107 typedef const struct __CFDictionary * CFDictionaryRef;
108 typedef struct __CFDictionary * CFMutableDictionaryRef;
109 extern CFMutableDictionaryRef CFDictionaryCreateMutable(CFAllocatorRef allocator, CFIndex capacity, const CFDictionaryKeyCallBacks *keyCallBacks, const CFDictionaryValueCallBacks *valueCallBacks) CF_RETURNS_RETAINED;
110 typedef UInt32 CFStringEncoding;
111 enum {
112 kCFStringEncodingMacRoman = 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  };
113 extern CFStringRef CFStringCreateWithCString(CFAllocatorRef alloc, const char *cStr, CFStringEncoding encoding) CF_RETURNS_RETAINED;
114 typedef double CFTimeInterval;
115 typedef CFTimeInterval CFAbsoluteTime;
116 extern CFAbsoluteTime CFAbsoluteTimeGetCurrent(void);
117 typedef const struct __CFDate * CFDateRef;
118 extern CFDateRef CFDateCreate(CFAllocatorRef allocator, CFAbsoluteTime at) CF_RETURNS_RETAINED;
119 extern CFAbsoluteTime CFDateGetAbsoluteTime(CFDateRef theDate);
120 typedef __darwin_natural_t natural_t;
121 typedef natural_t mach_port_name_t;
122 typedef mach_port_name_t mach_port_t;
123 typedef int kern_return_t;
124 typedef kern_return_t mach_error_t;
125 enum {
126 kCFNumberSInt8Type = 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    };
127 typedef CFIndex CFNumberType;
128 typedef const struct __CFNumber * CFNumberRef;
129 extern CFNumberRef CFNumberCreate(CFAllocatorRef allocator, CFNumberType theType, const void *valuePtr) CF_RETURNS_RETAINED;
130 typedef const struct __CFAttributedString *CFAttributedStringRef;
131 typedef struct __CFAttributedString *CFMutableAttributedStringRef;
132 extern CFAttributedStringRef CFAttributedStringCreate(CFAllocatorRef alloc, CFStringRef str, CFDictionaryRef attributes) CF_RETURNS_RETAINED ;
133 extern CFMutableAttributedStringRef CFAttributedStringCreateMutableCopy(CFAllocatorRef alloc, CFIndex maxLength, CFAttributedStringRef aStr) CF_RETURNS_RETAINED ;
134 extern void CFAttributedStringSetAttribute(CFMutableAttributedStringRef aStr, CFRange range, CFStringRef attrName, CFTypeRef value) ;
135 typedef signed char BOOL;
136 typedef unsigned long NSUInteger;
137 @class NSString, Protocol;
138 extern void NSLog(NSString *format, ...) __attribute__((format(__NSString__, 1, 2)));
139 typedef struct _NSZone NSZone;
140 @class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator;
141 @protocol NSObject
142 - (BOOL)isEqual:(id)object;
143 - (id)retain;
144 - (oneway void)release;
145 - (id)autorelease;
146 - (NSString *)description;
147 - (instancetype)init;
148 @end
149 @protocol NSCopying 
150 - (id)copyWithZone:(NSZone *)zone;
151 @end
152 @protocol NSMutableCopying  - (id)mutableCopyWithZone:(NSZone *)zone;
153 @end
154 @protocol NSCoding  - (void)encodeWithCoder:(NSCoder *)aCoder;
155 @end
156 @interface NSObject <NSObject> {}
157 + (id)allocWithZone:(NSZone *)zone;
158 + (id)alloc;
159 + (id)new;
160 - (void)dealloc;
161 @end
162 @interface NSObject (NSCoderMethods)
163 - (id)awakeAfterUsingCoder:(NSCoder *)aDecoder;
164 @end
165 extern id NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone);
166 typedef struct {
167 }
168 NSFastEnumerationState;
169 @protocol NSFastEnumeration 
170 - (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len;
171 @end
172 @class NSString, NSDictionary;
173 @interface NSValue : NSObject <NSCopying, NSCoding>  - (void)getValue:(void *)value;
174 @end
175 @interface NSNumber : NSValue
176 - (char)charValue;
177 - (instancetype)initWithInt:(int)value;
178 + (NSNumber *)numberWithInt:(int)value;
179 @end
180 @class NSString;
181 @interface NSArray : NSObject <NSCopying, NSMutableCopying, NSCoding, NSFastEnumeration>
182 - (NSUInteger)count;
183 - (instancetype)initWithObjects:(const id [])objects count:(NSUInteger)cnt;
184 + (instancetype)arrayWithObject:(id)anObject;
185 + (instancetype)arrayWithObjects:(const id [])objects count:(NSUInteger)cnt;
186 + (instancetype)arrayWithObjects:(id)firstObj, ... __attribute__((sentinel(0,1)));
187 - (instancetype)initWithObjects:(id)firstObj, ... __attribute__((sentinel(0,1)));
188 - (instancetype)initWithArray:(NSArray *)array;
189 @end  @interface NSArray (NSArrayCreation)  + (instancetype)array;
190 @end       @interface NSAutoreleasePool : NSObject {
191 }
192 - (void)drain;
193 @end extern NSString * const NSBundleDidLoadNotification;
194 typedef double NSTimeInterval;
195 @interface NSDate : NSObject <NSCopying, NSCoding>  - (NSTimeInterval)timeIntervalSinceReferenceDate;
196 @end            typedef unsigned short unichar;
197 @interface NSString : NSObject <NSCopying, NSMutableCopying, NSCoding>
198 - (NSUInteger)length;
199 - (NSString *)stringByAppendingString:(NSString *)aString;
200 - ( const char *)UTF8String;
201 - (instancetype)initWithUTF8String:(const char *)nullTerminatedCString;
202 + (instancetype)stringWithUTF8String:(const char *)nullTerminatedCString;
203 @end        @class NSString, NSURL, NSError;
204 @interface NSData : NSObject <NSCopying, NSMutableCopying, NSCoding>  - (NSUInteger)length;
205 + (instancetype)dataWithBytesNoCopy:(void *)bytes length:(NSUInteger)length;
206 + (instancetype)dataWithBytesNoCopy:(void *)bytes length:(NSUInteger)length freeWhenDone:(BOOL)b;
207 @end   @class NSLocale, NSDate, NSCalendar, NSTimeZone, NSError, NSArray, NSMutableDictionary;
208 @interface NSDictionary : NSObject <NSCopying, NSMutableCopying, NSCoding, NSFastEnumeration>
209 - (NSUInteger)count;
210 + (instancetype)dictionaryWithObjects:(NSArray *)objects forKeys:(NSArray *)keys;
211 + (instancetype)dictionaryWithObjects:(const id [])objects forKeys:(const id <NSCopying> [])keys count:(NSUInteger)cnt;
212 @end
213 @interface NSMutableDictionary : NSDictionary  - (void)removeObjectForKey:(id)aKey;
214 - (void)setObject:(id)anObject forKey:(id)aKey;
215 @end  @interface NSMutableDictionary (NSMutableDictionaryCreation)  + (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
216 @end  typedef double CGFloat;
217 struct CGSize {
218 };
219 typedef struct CGSize CGSize;
220 struct CGRect {
221 };
222 typedef struct CGRect CGRect;
223 typedef mach_port_t io_object_t;
224 typedef char io_name_t[128];
225 typedef io_object_t io_iterator_t;
226 typedef io_object_t io_service_t;
227 typedef struct IONotificationPort * IONotificationPortRef;
228 typedef void (*IOServiceMatchingCallback)(  void * refcon,  io_iterator_t iterator );
229
230 CF_IMPLICIT_BRIDGING_ENABLED
231
232 io_service_t IOServiceGetMatchingService(  mach_port_t masterPort,  CFDictionaryRef matching );
233 kern_return_t IOServiceGetMatchingServices(  mach_port_t masterPort,  CFDictionaryRef matching,  io_iterator_t * existing );
234
235 CF_IMPLICIT_BRIDGING_DISABLED
236
237 kern_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)); // expected-note {{'IOServiceAddNotification' declared here}}
238 kern_return_t IOServiceAddMatchingNotification(  IONotificationPortRef notifyPort,  const io_name_t notificationType,  CFDictionaryRef CF_CONSUMED matching,         IOServiceMatchingCallback callback,         void * refCon,  io_iterator_t * notification );
239
240 CF_IMPLICIT_BRIDGING_ENABLED
241
242 CFMutableDictionaryRef IOServiceMatching(  const char * name );
243 CFMutableDictionaryRef IOServiceNameMatching(  const char * name );
244 CFMutableDictionaryRef IOBSDNameMatching(  mach_port_t masterPort,  uint32_t options,  const char * bsdName );
245 CFMutableDictionaryRef IOOpenFirmwarePathMatching(  mach_port_t masterPort,  uint32_t options,  const char * path );
246 CFMutableDictionaryRef IORegistryEntryIDMatching(  uint64_t entryID );
247
248 CF_IMPLICIT_BRIDGING_DISABLED
249
250 typedef struct __DASession * DASessionRef;
251 extern DASessionRef DASessionCreate( CFAllocatorRef allocator ) CF_RETURNS_RETAINED;
252 typedef struct __DADisk * DADiskRef;
253 extern DADiskRef DADiskCreateFromBSDName( CFAllocatorRef allocator, DASessionRef session, const char * name ) CF_RETURNS_RETAINED;
254 extern DADiskRef DADiskCreateFromIOMedia( CFAllocatorRef allocator, DASessionRef session, io_service_t media ) CF_RETURNS_RETAINED;
255 extern CFDictionaryRef DADiskCopyDescription( DADiskRef disk ) CF_RETURNS_RETAINED;
256 extern DADiskRef DADiskCopyWholeDisk( DADiskRef disk ) CF_RETURNS_RETAINED;
257 @interface NSTask : NSObject - (instancetype)init;
258 @end                    typedef struct CGColorSpace *CGColorSpaceRef;
259 typedef struct CGImage *CGImageRef;
260 typedef struct CGLayer *CGLayerRef;
261 @interface NSResponder : NSObject <NSCoding> {
262 }
263 @end    @protocol NSAnimatablePropertyContainer      - (id)animator;
264 @end  extern NSString *NSAnimationTriggerOrderIn ;
265 @interface NSView : NSResponder  <NSAnimatablePropertyContainer>  {
266 }
267 @end @protocol NSValidatedUserInterfaceItem - (SEL)action;
268 @end   @protocol NSUserInterfaceValidations - (BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)anItem;
269 @end  @class NSDate, NSDictionary, NSError, NSException, NSNotification;
270 @class NSTextField, NSPanel, NSArray, NSWindow, NSImage, NSButton, NSError;
271 @interface NSApplication : NSResponder <NSUserInterfaceValidations> {
272 }
273 - (void)beginSheet:(NSWindow *)sheet modalForWindow:(NSWindow *)docWindow modalDelegate:(id)modalDelegate didEndSelector:(SEL)didEndSelector contextInfo:(void *)contextInfo;
274 @end   enum {
275 NSTerminateCancel = 0,         NSTerminateNow = 1,         NSTerminateLater = 2 };
276 typedef NSUInteger NSApplicationTerminateReply;
277 @protocol NSApplicationDelegate <NSObject> @optional        - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender;
278 @end  @class NSAttributedString, NSEvent, NSFont, NSFormatter, NSImage, NSMenu, NSText, NSView, NSTextView;
279 @interface NSCell : NSObject <NSCopying, NSCoding> {
280 }
281 @end 
282 typedef struct {
283 }
284 CVTimeStamp;
285 @interface CIImage : NSObject <NSCoding, NSCopying> {
286 }
287 typedef int CIFormat;
288 @end  enum {
289 kDAReturnSuccess = 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 };
290 typedef mach_error_t DAReturn;
291 typedef const struct __DADissenter * DADissenterRef;
292 extern DADissenterRef DADissenterCreate( CFAllocatorRef allocator, DAReturn status, CFStringRef string ) CF_RETURNS_RETAINED;
293 @interface CIContext: NSObject {
294 }
295 - (CGImageRef)createCGImage:(CIImage *)im fromRect:(CGRect)r CF_RETURNS_RETAINED;
296 - (CGImageRef)createCGImage:(CIImage *)im fromRect:(CGRect)r     format:(CIFormat)f colorSpace:(CGColorSpaceRef)cs CF_RETURNS_RETAINED;
297 - (CGLayerRef)createCGLayerWithSize:(CGSize)size info:(CFDictionaryRef)d CF_RETURNS_RETAINED;
298 @end extern NSString* const QCRendererEventKey;
299 @protocol QCCompositionRenderer - (NSDictionary*) attributes;
300 @end   @interface QCRenderer : NSObject <QCCompositionRenderer> {
301 }
302 - (id) createSnapshotImageOfType:(NSString*)type NS_RETURNS_RETAINED;
303 @end  extern NSString* const QCViewDidStartRenderingNotification;
304 @interface QCView : NSView <QCCompositionRenderer> {
305 }
306 - (id) createSnapshotImageOfType:(NSString*)type NS_RETURNS_RETAINED;
307 @end    enum {
308 ICEXIFOrientation1 = 1,     ICEXIFOrientation2 = 2,     ICEXIFOrientation3 = 3,     ICEXIFOrientation4 = 4,     ICEXIFOrientation5 = 5,     ICEXIFOrientation6 = 6,     ICEXIFOrientation7 = 7,     ICEXIFOrientation8 = 8, };
309 @class ICDevice;
310 @protocol ICDeviceDelegate <NSObject>  @required      - (void)didRemoveDevice:(ICDevice*)device;
311 @end extern NSString *const ICScannerStatusWarmingUp;
312 @class ICScannerDevice;
313 @protocol ICScannerDeviceDelegate <ICDeviceDelegate>  @optional       - (void)scannerDeviceDidBecomeAvailable:(ICScannerDevice*)scanner;
314 @end
315
316 typedef long unsigned int __darwin_size_t;
317 typedef __darwin_size_t size_t;
318 typedef unsigned long CFTypeID;
319 struct CGPoint {
320   CGFloat x;
321   CGFloat y;
322 };
323 typedef struct CGPoint CGPoint;
324 typedef struct CGGradient *CGGradientRef;
325 typedef uint32_t CGGradientDrawingOptions;
326 extern CFTypeID CGGradientGetTypeID(void);
327 extern CGGradientRef CGGradientCreateWithColorComponents(CGColorSpaceRef
328   space, const CGFloat components[], const CGFloat locations[], size_t count) CF_RETURNS_RETAINED;
329 extern CGGradientRef CGGradientCreateWithColors(CGColorSpaceRef space,
330   CFArrayRef colors, const CGFloat locations[]) CF_RETURNS_RETAINED;
331 extern CGGradientRef CGGradientRetain(CGGradientRef gradient);
332
333 CF_IMPLICIT_BRIDGING_ENABLED
334
335 extern void CGGradientRelease(CGGradientRef gradient);
336
337 CF_IMPLICIT_BRIDGING_DISABLED
338
339 typedef struct CGContext *CGContextRef;
340 extern void CGContextDrawLinearGradient(CGContextRef context,
341     CGGradientRef gradient, CGPoint startPoint, CGPoint endPoint,
342     CGGradientDrawingOptions options);
343
344 CF_IMPLICIT_BRIDGING_ENABLED
345
346 extern CGColorSpaceRef CGColorSpaceCreateDeviceRGB(void);
347
348 CF_IMPLICIT_BRIDGING_DISABLED
349
350
351 @interface NSMutableArray : NSObject
352 - (void)addObject:(id)object;
353 + (instancetype)array;
354 @end
355
356 // This is how NSMakeCollectable is declared in the OS X 10.8 headers.
357 id NSMakeCollectable(CFTypeRef __attribute__((cf_consumed))) __attribute__((ns_returns_retained));
358
359 typedef const struct __CFUUID * CFUUIDRef;
360
361 extern
362 void *CFPlugInInstanceCreate(CFAllocatorRef allocator, CFUUIDRef factoryUUID, CFUUIDRef typeUUID);
363
364 //===----------------------------------------------------------------------===//
365 // Test cases.
366 //===----------------------------------------------------------------------===//
367
368 CFAbsoluteTime f1() {
369   CFAbsoluteTime t = CFAbsoluteTimeGetCurrent();
370   CFDateRef date = CFDateCreate(0, t);
371   CFRetain(date);
372   CFRelease(date);
373   CFDateGetAbsoluteTime(date); // no-warning
374   CFRelease(date);
375   t = CFDateGetAbsoluteTime(date);   // expected-warning{{Reference-counted object is used after it is released}}
376   return t;
377 }
378
379 CFAbsoluteTime f2() {
380   CFAbsoluteTime t = CFAbsoluteTimeGetCurrent();
381   CFDateRef date = CFDateCreate(0, t);  
382   [((NSDate*) date) retain];
383   CFRelease(date);
384   CFDateGetAbsoluteTime(date); // no-warning
385   [((NSDate*) date) release];
386   t = CFDateGetAbsoluteTime(date);   // expected-warning{{Reference-counted object is used after it is released}}
387   return t;
388 }
389
390
391 NSDate* global_x;
392
393 // Test to see if we suppress an error when we store the pointer
394 // to a global.
395
396 CFAbsoluteTime f3() {
397   CFAbsoluteTime t = CFAbsoluteTimeGetCurrent();
398   CFDateRef date = CFDateCreate(0, t);  
399   [((NSDate*) date) retain];
400   CFRelease(date);
401   CFDateGetAbsoluteTime(date); // no-warning
402   global_x = (NSDate*) date;  
403   [((NSDate*) date) release];
404   t = CFDateGetAbsoluteTime(date);   // no-warning
405   return t;
406 }
407
408 //---------------------------------------------------------------------------
409 // Test case 'f4' differs for region store and basic store.  See
410 // retain-release-region-store.m and retain-release-basic-store.m.
411 //---------------------------------------------------------------------------
412
413 // Test a leak.
414
415 CFAbsoluteTime f5(int x) {  
416   CFAbsoluteTime t = CFAbsoluteTimeGetCurrent();
417   CFDateRef date = CFDateCreate(0, t); // expected-warning{{leak}}
418   
419   if (x)
420     CFRelease(date);
421   
422   return t;
423 }
424
425 // Test a leak involving the return.
426
427 CFDateRef f6(int x) {  
428   CFDateRef date = CFDateCreate(0, CFAbsoluteTimeGetCurrent());  // expected-warning{{leak}}
429   CFRetain(date);
430   return date;
431 }
432
433 // Test a leak involving an overwrite.
434
435 CFDateRef f7() {
436   CFDateRef date = CFDateCreate(0, CFAbsoluteTimeGetCurrent());  //expected-warning{{leak}}
437   CFRetain(date);
438   date = CFDateCreate(0, CFAbsoluteTimeGetCurrent()); // expected-warning {{leak}}
439   return date;
440 }
441
442 // Generalization of Create rule.  MyDateCreate returns a CFXXXTypeRef, and
443 // has the word create.
444
445 CF_IMPLICIT_BRIDGING_ENABLED
446
447 CFDateRef MyDateCreate();
448
449 CF_IMPLICIT_BRIDGING_DISABLED
450
451
452 CFDateRef f8() {
453   CFDateRef date = MyDateCreate(); // expected-warning{{leak}}
454   CFRetain(date);  
455   return date;
456 }
457
458 __attribute__((cf_returns_retained)) CFDateRef f9() {
459   CFDateRef date = CFDateCreate(0, CFAbsoluteTimeGetCurrent()); // no-warning
460   int *p = 0;
461   // When allocations fail, CFDateCreate can return null.
462   if (!date) *p = 1; // expected-warning{{null}}
463   return date;
464 }
465
466 // Handle DiskArbitration API:
467 //
468 // http://developer.apple.com/DOCUMENTATION/DARWIN/Reference/DiscArbitrationFramework/
469 //
470 void f10(io_service_t media, DADiskRef d, CFStringRef s) {
471   DADiskRef disk = DADiskCreateFromBSDName(kCFAllocatorDefault, 0, "hello"); // expected-warning{{leak}}
472   if (disk) NSLog(@"ok");
473   
474   disk = DADiskCreateFromIOMedia(kCFAllocatorDefault, 0, media); // expected-warning{{leak}}
475   if (disk) NSLog(@"ok");
476
477   CFDictionaryRef dict = DADiskCopyDescription(d);  // expected-warning{{leak}}
478   if (dict) NSLog(@"ok"); 
479   
480   disk = DADiskCopyWholeDisk(d); // expected-warning{{leak}}
481   if (disk) NSLog(@"ok");
482     
483   DADissenterRef dissenter = DADissenterCreate(kCFAllocatorDefault,   // expected-warning{{leak}}
484                                                 kDAReturnSuccess, s);
485   if (dissenter) NSLog(@"ok");
486   
487   DASessionRef session = DASessionCreate(kCFAllocatorDefault);  // expected-warning{{leak}}
488   if (session) NSLog(@"ok");
489 }
490
491 // Test retain/release checker with CFString and CFMutableArray.
492 void f11() {
493   // Create the array.
494   CFMutableArrayRef A = CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks);
495
496   // Create a string.
497   CFStringRef s1 = CFStringCreateWithCString(0, "hello world",
498                                              kCFStringEncodingUTF8);
499
500   // Add the string to the array.
501   CFArrayAppendValue(A, s1);
502   
503   // Decrement the reference count.
504   CFRelease(s1); // no-warning
505   
506   // Get the string.  We don't own it.
507   s1 = (CFStringRef) CFArrayGetValueAtIndex(A, 0);
508   
509   // Release the array.
510   CFRelease(A); // no-warning
511   
512   // Release the string.  This is a bug.
513   CFRelease(s1); // expected-warning{{Incorrect decrement of the reference count}}
514 }
515
516 // PR 3337: Handle functions declared using typedefs.
517 typedef CFTypeRef CREATEFUN();
518
519 CF_IMPLICIT_BRIDGING_ENABLED
520
521 CFTypeRef MyCreateFun();
522
523 CF_IMPLICIT_BRIDGING_DISABLED
524
525
526 void f12() {
527   CFTypeRef o = MyCreateFun(); // expected-warning {{leak}}
528 }
529
530 void f13_autorelease() {
531   CFMutableArrayRef A = CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // no-warning
532   [(id) A autorelease]; // no-warning
533 }
534
535 void f13_autorelease_b() {
536   CFMutableArrayRef A = CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks);
537   [(id) A autorelease];
538   [(id) A autorelease];
539 } // expected-warning{{Object autoreleased too many times}}
540
541 CFMutableArrayRef f13_autorelease_c() {
542   CFMutableArrayRef A = CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks);
543   [(id) A autorelease];
544   [(id) A autorelease]; 
545   return A; // expected-warning{{Object autoreleased too many times}}
546 }
547
548 CFMutableArrayRef f13_autorelease_d() {
549   CFMutableArrayRef A = CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks);
550   [(id) A autorelease];
551   [(id) A autorelease]; 
552   CFMutableArrayRef B = CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // expected-warning{{Object autoreleased too many times}}
553   CFRelease(B); // no-warning
554   while (1) {}
555 }
556
557
558 // This case exercises the logic where the leak site is the same as the allocation site.
559 void f14_leakimmediately() {
560   CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // expected-warning{{leak}}
561 }
562
563 // Test that we track an allocated object beyond the point where the *name*
564 // of the variable storing the reference is no longer live.
565 void f15() {
566   // Create the array.
567   CFMutableArrayRef A = CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks);
568   CFMutableArrayRef *B = &A;
569   // At this point, the name 'A' is no longer live.
570   CFRelease(*B);  // no-warning
571 }
572
573 // Test when we pass NULL to CFRetain/CFRelease/CFMakeCollectable/CFAutorelease.
574 void f16(int x, CFTypeRef p) {
575   if (p)
576     return;
577
578   switch (x) {
579   case 0:
580     CFRelease(p);
581     break;
582   case 1:
583     CFRetain(p);
584     break;
585   case 2:
586     CFMakeCollectable(p);
587     break;
588   case 3:
589     CFAutorelease(p);
590     break;
591   default:
592     break;
593   }
594 }
595
596 // Test that an object is non-null after CFRetain/CFRelease/CFMakeCollectable/CFAutorelease.
597 void f17(int x, CFTypeRef p) {
598   switch (x) {
599   case 0:
600     CFRelease(p);
601     if (!p)
602       CFRelease(0); // no-warning
603     break;
604   case 1:
605     CFRetain(p);
606     if (!p)
607       CFRetain(0); // no-warning
608     break;
609   case 2:
610     CFMakeCollectable(p);
611     if (!p)
612       CFMakeCollectable(0); // no-warning
613     break;
614   case 3:
615     CFAutorelease(p);
616     if (!p)
617       CFAutorelease(0); // no-warning
618     break;
619   default:
620     break;
621   }
622 }
623
624 // Test basic tracking of ivars associated with 'self'.  For the retain/release
625 // checker we currently do not want to flag leaks associated with stores
626 // of tracked objects to ivars.
627 @interface SelfIvarTest : NSObject {
628   id myObj;
629 }
630 - (void)test_self_tracking;
631 @end
632
633 @implementation SelfIvarTest
634 - (void)test_self_tracking {
635   myObj = (id) CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // no-warning
636 }
637 @end
638
639 // Test return of non-owned objects in contexts where an owned object
640 // is expected.
641 @interface TestReturnNotOwnedWhenExpectedOwned
642 - (NSString*)newString;
643 @end
644
645 @implementation TestReturnNotOwnedWhenExpectedOwned
646 - (NSString*)newString {
647   NSString *s = [NSString stringWithUTF8String:"hello"];
648   return s; // expected-warning{{Object with a +0 retain count returned to caller where a +1 (owning) retain count is expected}}
649 }
650 @end
651
652 // <rdar://problem/6659160>
653 int isFoo(char c);
654
655 static void rdar_6659160(char *inkind, char *inname)
656 {
657   // We currently expect that [NSObject alloc] cannot fail.  This
658   // will be a toggled flag in the future.  It can indeed return null, but
659   // Cocoa programmers generally aren't expected to reason about out-of-memory
660   // conditions.
661   NSString *kind = [[NSString alloc] initWithUTF8String:inkind];  // expected-warning{{leak}}
662   
663   // We do allow stringWithUTF8String to fail.  This isn't really correct, as
664   // far as returning 0.  In most error conditions it will throw an exception.
665   // If allocation fails it could return 0, but again this
666   // isn't expected.
667   NSString *name = [NSString stringWithUTF8String:inname];
668   if(!name)
669     return;
670
671   const char *kindC = 0;
672   const char *nameC = 0;
673   
674   // In both cases, we cannot reach a point down below where we
675   // dereference kindC or nameC with either being null.  This is because
676   // we assume that [NSObject alloc] doesn't fail and that we have the guard
677   // up above.
678   
679   if(kind)
680     kindC = [kind UTF8String];
681   if(name)
682     nameC = [name UTF8String];
683   if(!isFoo(kindC[0])) // expected-warning{{null}}
684     return;
685   if(!isFoo(nameC[0])) // no-warning
686     return;
687
688   [kind release];
689   [name release]; // expected-warning{{Incorrect decrement of the reference count}}
690 }
691
692 // PR 3677 - 'allocWithZone' should be treated as following the Cocoa naming
693 //  conventions with respect to 'return'ing ownership.
694 @interface PR3677: NSObject @end
695 @implementation PR3677
696 + (id)allocWithZone:(NSZone *)inZone {
697   return [super allocWithZone:inZone];  // no-warning
698 }
699 @end
700
701 // PR 3820 - Reason about calls to -dealloc
702 void pr3820_DeallocInsteadOfRelease(void)
703 {
704   id foo = [[NSString alloc] init]; // no-warning
705   [foo dealloc];
706   // foo is not leaked, since it has been deallocated.
707 }
708
709 void pr3820_ReleaseAfterDealloc(void)
710 {
711   id foo = [[NSString alloc] init];
712   [foo dealloc];
713   [foo release];  // expected-warning{{used after it is release}}
714   // NSInternalInconsistencyException: message sent to deallocated object
715 }
716
717 void pr3820_DeallocAfterRelease(void)
718 {
719   NSLog(@"\n\n[%s]", __FUNCTION__);
720   id foo = [[NSString alloc] init];
721   [foo release];
722   [foo dealloc]; // expected-warning{{used after it is released}}
723   // message sent to released object
724 }
725
726 // From <rdar://problem/6704930>.  The problem here is that 'length' binds to
727 // '($0 - 1)' after '--length', but SimpleConstraintManager doesn't know how to
728 // reason about '($0 - 1) > constant'.  As a temporary hack, we drop the value
729 // of '($0 - 1)' and conjure a new symbol.
730 void rdar6704930(unsigned char *s, unsigned int length) {
731   NSString* name = 0;
732   if (s != 0) {
733     if (length > 0) {
734       while (length > 0) {
735         if (*s == ':') {
736           ++s;
737           --length;
738           name = [[NSString alloc] init]; // no-warning
739           break;
740         }
741         ++s;
742         --length;
743       }
744       if ((length == 0) && (name != 0)) {
745         [name release];
746         name = 0;
747       }
748       if (length == 0) { // no ':' found -> use it all as name
749         name = [[NSString alloc] init]; // no-warning
750       }
751     }
752   }
753
754   if (name != 0) {
755     [name release];
756   }
757 }
758
759 //===----------------------------------------------------------------------===//
760 // <rdar://problem/6833332>
761 // One build of the analyzer accidentally stopped tracking the allocated
762 // object after the 'retain'.
763 //===----------------------------------------------------------------------===//
764
765 @interface rdar_6833332 : NSObject <NSApplicationDelegate> {
766     NSWindow *window;
767 }
768 @property (nonatomic, retain) NSWindow *window;
769 @end
770
771 @implementation rdar_6833332
772 @synthesize window;
773 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
774  NSMutableDictionary *dict = [[NSMutableDictionary dictionaryWithCapacity:4] retain]; // expected-warning{{leak}}
775
776  [dict setObject:@"foo" forKey:@"bar"];
777
778  NSLog(@"%@", dict);
779 }
780 - (void)dealloc {
781     [window release];
782     [super dealloc];
783 }
784
785 - (void)radar10102244 {
786  NSMutableDictionary *dict = [[NSMutableDictionary dictionaryWithCapacity:4] retain]; // expected-warning{{leak}} 
787  if (window) 
788    NSLog(@"%@", window);    
789 }
790 @end
791
792 //===----------------------------------------------------------------------===//
793 // <rdar://problem/6257780> clang checker fails to catch use-after-release
794 //===----------------------------------------------------------------------===//
795
796 int rdar_6257780_Case1() {
797   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
798   NSArray *array = [NSArray array];
799   [array release]; // expected-warning{{Incorrect decrement of the reference count of an object that is not owned at this point by the caller}}
800   [pool drain];
801   return 0;
802 }
803
804 //===----------------------------------------------------------------------===//
805 // <rdar://problem/10640253> Analyzer is confused about NSAutoreleasePool -allocWithZone:.
806 //===----------------------------------------------------------------------===//
807
808 void rdar_10640253_autorelease_allocWithZone() {
809     NSAutoreleasePool *pool = [[NSAutoreleasePool allocWithZone:(NSZone*)0] init];
810     (void) pool;
811 }
812
813 //===----------------------------------------------------------------------===//
814 // <rdar://problem/6866843> Checker should understand new/setObject:/release constructs
815 //===----------------------------------------------------------------------===//
816
817 void rdar_6866843() {
818  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
819  NSMutableDictionary* dictionary = [[NSMutableDictionary alloc] init];
820  NSArray* array = [[NSArray alloc] init];
821  [dictionary setObject:array forKey:@"key"];
822  [array release];
823  // Using 'array' here should be fine
824  NSLog(@"array = %@\n", array); // no-warning
825  // Now the array is released
826  [dictionary release];
827  [pool drain];
828 }
829
830
831 //===----------------------------------------------------------------------===//
832 // <rdar://problem/6877235> Classes typedef-ed to CF objects should get the same treatment as CF objects
833 //===----------------------------------------------------------------------===//
834
835 typedef CFTypeRef OtherRef;
836
837 @interface RDar6877235 : NSObject {}
838 - (CFTypeRef)_copyCFTypeRef CF_RETURNS_RETAINED;
839 - (OtherRef)_copyOtherRef CF_RETURNS_RETAINED;
840 @end
841
842 @implementation RDar6877235
843 - (CFTypeRef)_copyCFTypeRef {
844   return [[NSString alloc] init]; // no-warning
845 }
846 - (OtherRef)_copyOtherRef {
847   return [[NSString alloc] init]; // no-warning
848 }
849 @end
850
851 //===----------------------------------------------------------------------===//
852 // <rdar://problem/6320065> false positive - init method returns an object
853 // owned by caller
854 //===----------------------------------------------------------------------===//
855
856 @interface RDar6320065 : NSObject {
857   NSString *_foo;
858 }
859 - (instancetype)initReturningNewClass;
860 - (id)_initReturningNewClassBad;
861 - (instancetype)initReturningNewClassBad2;
862 @end
863
864 @interface RDar6320065Subclass : RDar6320065
865 @end
866
867 @implementation RDar6320065
868 - (instancetype)initReturningNewClass {
869   [self release];
870   self = [[RDar6320065Subclass alloc] init]; // no-warning
871   return self;
872 }
873 - (id)_initReturningNewClassBad {
874   [self release];
875   [[RDar6320065Subclass alloc] init]; // expected-warning {{leak}}
876   return self;
877 }
878 - (instancetype)initReturningNewClassBad2 {
879   [self release];
880   self = [[RDar6320065Subclass alloc] init];
881   return [self autorelease]; // expected-warning{{Object with a +0 retain count returned to caller where a +1 (owning) retain count is expected}}
882 }
883
884 @end
885
886 @implementation RDar6320065Subclass
887 @end
888
889 int RDar6320065_test() {
890   RDar6320065 *test = [[RDar6320065 alloc] init]; // no-warning
891   [test release];
892   return 0;
893 }
894
895 //===----------------------------------------------------------------------===//
896 // <rdar://problem/7129086> -awakeAfterUsingCoder: returns an owned object 
897 //  and claims the receiver
898 //===----------------------------------------------------------------------===//
899
900 @interface RDar7129086 : NSObject {} @end
901 @implementation RDar7129086
902 - (id)awakeAfterUsingCoder:(NSCoder *)aDecoder {
903   [self release]; // no-warning
904   return [NSString alloc];  // no-warning
905 }
906 @end
907
908 //===----------------------------------------------------------------------===//
909 // <rdar://problem/6859457> [NSData dataWithBytesNoCopy] does not return a
910 //  retained object
911 //===----------------------------------------------------------------------===//
912
913 @interface RDar6859457 : NSObject {}
914 - (NSString*) NoCopyString;
915 - (NSString*) noCopyString;
916 @end
917
918 @implementation RDar6859457 
919 - (NSString*) NoCopyString { return [[NSString alloc] init]; } // expected-warning{{leak}}
920 - (NSString*) noCopyString { return [[NSString alloc] init]; } // expected-warning{{leak}}
921 @end
922
923 void test_RDar6859457(RDar6859457 *x, void *bytes, NSUInteger dataLength) {
924   [x NoCopyString]; // expected-warning{{leak}}
925   [x noCopyString]; // expected-warning{{leak}}
926   [NSData dataWithBytesNoCopy:bytes length:dataLength];  // no-warning
927   [NSData dataWithBytesNoCopy:bytes length:dataLength freeWhenDone:1]; // no-warning
928 }
929
930 //===----------------------------------------------------------------------===//
931 // PR 4230 - an autorelease pool is not necessarily leaked during a premature
932 //  return
933 //===----------------------------------------------------------------------===//
934
935 static void PR4230(void)
936 {
937   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // no-warning
938   NSString *object = [[[NSString alloc] init] autorelease]; // no-warning
939   return;
940 }
941
942 static void PR4230_new(void)
943 {
944   NSAutoreleasePool *pool = [NSAutoreleasePool new]; // no-warning
945   NSString *object = [[[NSString alloc] init] autorelease]; // no-warning
946   return;
947 }
948
949 //===----------------------------------------------------------------------===//
950 // Method name that has a null IdentifierInfo* for its first selector slot.
951 // This test just makes sure that we handle it.
952 //===----------------------------------------------------------------------===//
953
954 @interface TestNullIdentifier
955 @end
956
957 @implementation TestNullIdentifier
958 + (id):(int)x, ... {
959   return [[NSString alloc] init]; // expected-warning{{leak}}
960 }
961 @end
962
963 //===----------------------------------------------------------------------===//
964 // <rdar://problem/6893565> don't flag leaks for return types that cannot be 
965 //                          determined to be CF types
966 //===----------------------------------------------------------------------===//
967
968 // We don't know if 'struct s6893565' represents a Core Foundation type, so
969 // we shouldn't emit an error here.
970 typedef struct s6893565* TD6893565;
971
972 @interface RDar6893565 {}
973 -(TD6893565)newThing;
974 @end
975
976 @implementation RDar6893565
977 -(TD6893565)newThing {  
978   return (TD6893565) [[NSString alloc] init]; // no-warning
979 }
980 @end
981
982 //===----------------------------------------------------------------------===//
983 // <rdar://problem/6902710> clang: false positives w/QC and CoreImage methods
984 //===----------------------------------------------------------------------===//
985
986 void rdar6902710(QCView *view, QCRenderer *renderer, CIContext *context,
987                  NSString *str, CIImage *img, CGRect rect,
988                  CIFormat form, CGColorSpaceRef cs) {
989   [view createSnapshotImageOfType:str]; // expected-warning{{leak}}
990   [renderer createSnapshotImageOfType:str]; // expected-warning{{leak}}
991   [context createCGImage:img fromRect:rect]; // expected-warning{{leak}}
992   [context createCGImage:img fromRect:rect format:form colorSpace:cs]; // expected-warning{{leak}}
993 }
994
995 //===----------------------------------------------------------------------===//
996 // <rdar://problem/6945561> -[CIContext createCGLayerWithSize:info:]
997 //                           misinterpreted by clang scan-build
998 //===----------------------------------------------------------------------===//
999
1000 void rdar6945561(CIContext *context, CGSize size, CFDictionaryRef d) {
1001   [context createCGLayerWithSize:size info:d]; // expected-warning{{leak}}
1002 }
1003
1004 //===----------------------------------------------------------------------===//
1005 // <rdar://problem/6961230> add knowledge of IOKit functions to retain/release 
1006 //                          checker
1007 //===----------------------------------------------------------------------===//
1008
1009 void IOBSDNameMatching_wrapper(mach_port_t masterPort, uint32_t options,  const char * bsdName) {  
1010   IOBSDNameMatching(masterPort, options, bsdName); // expected-warning{{leak}}
1011 }
1012
1013 void IOServiceMatching_wrapper(const char * name) {
1014   IOServiceMatching(name); // expected-warning{{leak}}
1015 }
1016
1017 void IOServiceNameMatching_wrapper(const char * name) {
1018   IOServiceNameMatching(name); // expected-warning{{leak}}
1019 }
1020
1021 CF_RETURNS_RETAINED CFDictionaryRef CreateDict();
1022
1023 void IOServiceAddNotification_wrapper(mach_port_t masterPort, const io_name_t notificationType,
1024   mach_port_t wakePort, uintptr_t reference, io_iterator_t * notification ) {
1025
1026   CFDictionaryRef matching = CreateDict();
1027   CFRelease(matching);
1028   IOServiceAddNotification(masterPort, notificationType, matching, // expected-warning{{used after it is released}} expected-warning{{deprecated}}
1029                            wakePort, reference, notification);
1030 }
1031
1032 void IORegistryEntryIDMatching_wrapper(uint64_t entryID ) {
1033   IORegistryEntryIDMatching(entryID); // expected-warning{{leak}}
1034 }
1035
1036 void IOOpenFirmwarePathMatching_wrapper(mach_port_t masterPort, uint32_t options,
1037                                         const char * path) {
1038   IOOpenFirmwarePathMatching(masterPort, options, path); // expected-warning{{leak}}
1039 }
1040
1041 void IOServiceGetMatchingService_wrapper(mach_port_t masterPort) {
1042   CFDictionaryRef matching = CreateDict();
1043   IOServiceGetMatchingService(masterPort, matching);
1044   CFRelease(matching); // expected-warning{{used after it is released}}
1045 }
1046
1047 void IOServiceGetMatchingServices_wrapper(mach_port_t masterPort, io_iterator_t *existing) {
1048   CFDictionaryRef matching = CreateDict();
1049   IOServiceGetMatchingServices(masterPort, matching, existing);
1050   CFRelease(matching); // expected-warning{{used after it is released}}
1051 }
1052
1053 void IOServiceAddMatchingNotification_wrapper(IONotificationPortRef notifyPort, const io_name_t notificationType, 
1054   IOServiceMatchingCallback callback, void * refCon, io_iterator_t * notification) {
1055     
1056   CFDictionaryRef matching = CreateDict();
1057   IOServiceAddMatchingNotification(notifyPort, notificationType, matching, callback, refCon, notification);
1058   CFRelease(matching); // expected-warning{{used after it is released}}
1059 }
1060
1061 //===----------------------------------------------------------------------===//
1062 // Test of handling objects whose references "escape" to containers.
1063 //===----------------------------------------------------------------------===//
1064
1065 void CFDictionaryAddValue(CFMutableDictionaryRef, void *, void *);
1066
1067 // <rdar://problem/6539791>
1068 void rdar_6539791(CFMutableDictionaryRef y, void* key, void* val_key) {
1069   CFMutableDictionaryRef x = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
1070   CFDictionaryAddValue(y, key, x);
1071   CFRelease(x); // the dictionary keeps a reference, so the object isn't deallocated yet
1072   signed z = 1;
1073   CFNumberRef value = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &z);
1074   if (value) {
1075     CFDictionaryAddValue(x, val_key, (void*)value); // no-warning
1076     CFRelease(value);
1077     CFDictionaryAddValue(y, val_key, (void*)value); // no-warning
1078   }
1079 }
1080
1081 // <rdar://problem/6560661>
1082 // Same issue, except with "AppendValue" functions.
1083 void rdar_6560661(CFMutableArrayRef x) {
1084   signed z = 1;
1085   CFNumberRef value = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &z);
1086   // CFArrayAppendValue keeps a reference to value.
1087   CFArrayAppendValue(x, value);
1088   CFRelease(value);
1089   CFRetain(value);
1090   CFRelease(value); // no-warning
1091 }
1092
1093 // <rdar://problem/7152619>
1094 // Same issue, excwept with "CFAttributeStringSetAttribute".
1095 void rdar_7152619(CFStringRef str) {
1096   CFAttributedStringRef string = CFAttributedStringCreate(kCFAllocatorDefault, str, 0);
1097   CFMutableAttributedStringRef attrString = CFAttributedStringCreateMutableCopy(kCFAllocatorDefault, 100, string);
1098   CFRelease(string);
1099   NSNumber *number = [[NSNumber alloc] initWithInt:5]; // expected-warning{{leak}}
1100   CFAttributedStringSetAttribute(attrString, CFRangeMake(0, 1), str, number);
1101   [number release];
1102   [number retain];
1103   CFRelease(attrString);  
1104 }
1105
1106 //===----------------------------------------------------------------------===//
1107 // Test of handling CGGradientXXX functions.
1108 //===----------------------------------------------------------------------===//
1109
1110 void rdar_7184450(CGContextRef myContext, CGFloat x, CGPoint myStartPoint,
1111                   CGPoint myEndPoint) {
1112   size_t num_locations = 6;
1113   CGFloat locations[6] = { 0.0, 0.265, 0.28, 0.31, 0.36, 1.0 };
1114   CGFloat components[28] = { 239.0/256.0, 167.0/256.0, 170.0/256.0,
1115      x,  // Start color
1116     207.0/255.0, 39.0/255.0, 39.0/255.0, x,
1117     147.0/255.0, 21.0/255.0, 22.0/255.0, x,
1118     175.0/255.0, 175.0/255.0, 175.0/255.0, x,
1119     255.0/255.0,255.0/255.0, 255.0/255.0, x,
1120     255.0/255.0,255.0/255.0, 255.0/255.0, x
1121   }; // End color
1122   
1123   CGGradientRef myGradient =
1124     CGGradientCreateWithColorComponents(CGColorSpaceCreateDeviceRGB(), // expected-warning{{leak}}
1125       components, locations, num_locations);
1126
1127   CGContextDrawLinearGradient(myContext, myGradient, myStartPoint, myEndPoint,
1128                               0);
1129   CGGradientRelease(myGradient);
1130 }
1131
1132 void rdar_7184450_pos(CGContextRef myContext, CGFloat x, CGPoint myStartPoint,
1133                   CGPoint myEndPoint) {
1134   size_t num_locations = 6;
1135   CGFloat locations[6] = { 0.0, 0.265, 0.28, 0.31, 0.36, 1.0 };
1136   CGFloat components[28] = { 239.0/256.0, 167.0/256.0, 170.0/256.0,
1137      x,  // Start color
1138     207.0/255.0, 39.0/255.0, 39.0/255.0, x,
1139     147.0/255.0, 21.0/255.0, 22.0/255.0, x,
1140     175.0/255.0, 175.0/255.0, 175.0/255.0, x,
1141     255.0/255.0,255.0/255.0, 255.0/255.0, x,
1142     255.0/255.0,255.0/255.0, 255.0/255.0, x
1143   }; // End color
1144   
1145   CGGradientRef myGradient =
1146    CGGradientCreateWithColorComponents(CGColorSpaceCreateDeviceRGB(), components, locations, num_locations); // expected-warning 2 {{leak}}
1147
1148   CGContextDrawLinearGradient(myContext, myGradient, myStartPoint, myEndPoint,
1149                               0);
1150 }
1151
1152 //===----------------------------------------------------------------------===//
1153 // <rdar://problem/7299394> clang false positive: retained instance passed to
1154 //                          thread in pthread_create marked as leak
1155 //
1156 // Until we have full IPA, the analyzer should stop tracking the reference
1157 // count of objects passed to pthread_create.
1158 //
1159 //===----------------------------------------------------------------------===//
1160
1161 struct _opaque_pthread_t {};
1162 struct _opaque_pthread_attr_t {};
1163 typedef struct _opaque_pthread_t *__darwin_pthread_t;
1164 typedef struct _opaque_pthread_attr_t __darwin_pthread_attr_t;
1165 typedef __darwin_pthread_t pthread_t;
1166 typedef __darwin_pthread_attr_t pthread_attr_t;
1167 typedef unsigned long __darwin_pthread_key_t;
1168 typedef __darwin_pthread_key_t pthread_key_t;
1169
1170 int pthread_create(pthread_t *, const pthread_attr_t *,
1171                    void *(*)(void *), void *);
1172
1173 int pthread_setspecific(pthread_key_t key, const void *value);
1174
1175 void *rdar_7299394_start_routine(void *p) {
1176   [((id) p) release];
1177   return 0;
1178 }
1179 void rdar_7299394(pthread_attr_t *attr, pthread_t *thread, void *args) {
1180   NSNumber *number = [[NSNumber alloc] initWithInt:5]; // no-warning
1181   pthread_create(thread, attr, rdar_7299394_start_routine, number);
1182 }
1183 void rdar_7299394_positive(pthread_attr_t *attr, pthread_t *thread) {
1184   NSNumber *number = [[NSNumber alloc] initWithInt:5]; // expected-warning{{leak}}
1185 }
1186
1187 //===----------------------------------------------------------------------===//
1188 // <rdar://problem/11282706> false positive with not understanding thread
1189 // local storage
1190 //===----------------------------------------------------------------------===//
1191
1192 void rdar11282706(pthread_key_t key) {
1193   NSNumber *number = [[NSNumber alloc] initWithInt:5]; // no-warning
1194   pthread_setspecific(key, (void*) number);
1195 }
1196
1197 //===----------------------------------------------------------------------===//
1198 // <rdar://problem/7283567> False leak associated with call to 
1199 //                          CVPixelBufferCreateWithBytes ()
1200 //
1201 // According to the Core Video Reference (ADC), CVPixelBufferCreateWithBytes and
1202 // CVPixelBufferCreateWithPlanarBytes can release (via a callback) the
1203 // pixel buffer object.  These test cases show how the analyzer stops tracking
1204 // the reference count for the objects passed for this argument.  This
1205 // could be made smarter.
1206 //===----------------------------------------------------------------------===//
1207
1208 typedef int int32_t;
1209 typedef UInt32 FourCharCode;
1210 typedef FourCharCode OSType;
1211 typedef uint64_t CVOptionFlags;
1212 typedef int32_t CVReturn;
1213 typedef struct __CVBuffer *CVBufferRef;
1214 typedef CVBufferRef CVImageBufferRef;
1215 typedef CVImageBufferRef CVPixelBufferRef;
1216 typedef void (*CVPixelBufferReleaseBytesCallback)( void *releaseRefCon, const void *baseAddress );
1217
1218 extern CVReturn CVPixelBufferCreateWithBytes(CFAllocatorRef allocator,
1219             size_t width,
1220             size_t height,
1221             OSType pixelFormatType,
1222             void *baseAddress,
1223             size_t bytesPerRow,
1224             CVPixelBufferReleaseBytesCallback releaseCallback,
1225             void *releaseRefCon,
1226             CFDictionaryRef pixelBufferAttributes,
1227                    CVPixelBufferRef *pixelBufferOut) ;
1228
1229 typedef void (*CVPixelBufferReleasePlanarBytesCallback)( void *releaseRefCon, const void *dataPtr, size_t dataSize, size_t numberOfPlanes, const void *planeAddresses[] );
1230
1231 extern CVReturn CVPixelBufferCreateWithPlanarBytes(CFAllocatorRef allocator,
1232         size_t width,
1233         size_t height,
1234         OSType pixelFormatType,
1235         void *dataPtr,
1236         size_t dataSize,
1237         size_t numberOfPlanes,
1238         void *planeBaseAddress[],
1239         size_t planeWidth[],
1240         size_t planeHeight[],
1241         size_t planeBytesPerRow[],
1242         CVPixelBufferReleasePlanarBytesCallback releaseCallback,
1243         void *releaseRefCon,
1244         CFDictionaryRef pixelBufferAttributes,
1245         CVPixelBufferRef *pixelBufferOut) ;
1246
1247 extern CVReturn CVPixelBufferCreateWithBytes(CFAllocatorRef allocator,
1248             size_t width,
1249             size_t height,
1250             OSType pixelFormatType,
1251             void *baseAddress,
1252             size_t bytesPerRow,
1253             CVPixelBufferReleaseBytesCallback releaseCallback,
1254             void *releaseRefCon,
1255             CFDictionaryRef pixelBufferAttributes,
1256                    CVPixelBufferRef *pixelBufferOut) ;
1257
1258 CVReturn rdar_7283567(CFAllocatorRef allocator, size_t width, size_t height,
1259                       OSType pixelFormatType, void *baseAddress,
1260                       size_t bytesPerRow,
1261                       CVPixelBufferReleaseBytesCallback releaseCallback,
1262                       CFDictionaryRef pixelBufferAttributes,
1263                       CVPixelBufferRef *pixelBufferOut) {
1264
1265   // For the allocated object, it doesn't really matter what type it is
1266   // for the purpose of this test.  All we want to show is that
1267   // this is freed later by the callback.
1268   NSNumber *number = [[NSNumber alloc] initWithInt:5]; // no-warning
1269   
1270   return CVPixelBufferCreateWithBytes(allocator, width, height, pixelFormatType,
1271                                 baseAddress, bytesPerRow, releaseCallback,
1272                                 number, // potentially released by callback
1273                                 pixelBufferAttributes, pixelBufferOut) ;
1274 }
1275
1276 CVReturn rdar_7283567_2(CFAllocatorRef allocator, size_t width, size_t height,
1277         OSType pixelFormatType, void *dataPtr, size_t dataSize,
1278         size_t numberOfPlanes, void *planeBaseAddress[],
1279         size_t planeWidth[], size_t planeHeight[], size_t planeBytesPerRow[],
1280         CVPixelBufferReleasePlanarBytesCallback releaseCallback,
1281         CFDictionaryRef pixelBufferAttributes,
1282         CVPixelBufferRef *pixelBufferOut) {
1283     
1284     // For the allocated object, it doesn't really matter what type it is
1285     // for the purpose of this test.  All we want to show is that
1286     // this is freed later by the callback.
1287     NSNumber *number = [[NSNumber alloc] initWithInt:5]; // no-warning
1288
1289     return CVPixelBufferCreateWithPlanarBytes(allocator,
1290               width, height, pixelFormatType, dataPtr, dataSize,
1291               numberOfPlanes, planeBaseAddress, planeWidth,
1292               planeHeight, planeBytesPerRow, releaseCallback,
1293               number, // potentially released by callback
1294               pixelBufferAttributes, pixelBufferOut) ;
1295 }
1296
1297 //===----------------------------------------------------------------------===//
1298 // <rdar://problem/7358899> False leak associated with 
1299 //  CGBitmapContextCreateWithData
1300 //===----------------------------------------------------------------------===//
1301 typedef uint32_t CGBitmapInfo;
1302 typedef void (*CGBitmapContextReleaseDataCallback)(void *releaseInfo, void *data);
1303     
1304 CGContextRef CGBitmapContextCreateWithData(void *data,
1305     size_t width, size_t height, size_t bitsPerComponent,
1306     size_t bytesPerRow, CGColorSpaceRef space, CGBitmapInfo bitmapInfo,
1307     CGBitmapContextReleaseDataCallback releaseCallback, void *releaseInfo) CF_RETURNS_RETAINED;
1308
1309 void rdar_7358899(void *data,
1310       size_t width, size_t height, size_t bitsPerComponent,
1311       size_t bytesPerRow, CGColorSpaceRef space, CGBitmapInfo bitmapInfo,
1312       CGBitmapContextReleaseDataCallback releaseCallback) {
1313
1314     // For the allocated object, it doesn't really matter what type it is
1315     // for the purpose of this test.  All we want to show is that
1316     // this is freed later by the callback.
1317     NSNumber *number = [[NSNumber alloc] initWithInt:5]; // no-warning
1318
1319   CGBitmapContextCreateWithData(data, width, height, bitsPerComponent, // expected-warning{{leak}}
1320     bytesPerRow, space, bitmapInfo, releaseCallback, number);
1321 }
1322
1323 //===----------------------------------------------------------------------===//
1324 // <rdar://problem/7265711> allow 'new', 'copy', 'alloc', 'init' prefix to
1325 //  start before '_' when determining Cocoa fundamental rule
1326 //
1327 // Previously the retain/release checker just skipped prefixes before the
1328 // first '_' entirely.  Now the checker honors the prefix if it results in a
1329 // recognizable naming convention (e.g., 'new', 'init').
1330 //===----------------------------------------------------------------------===//
1331
1332 @interface RDar7265711 {}
1333 - (id) new_stuff;
1334 @end
1335
1336 void rdar7265711_a(RDar7265711 *x) {
1337   id y = [x new_stuff]; // expected-warning{{leak}}
1338 }
1339
1340 void rdar7265711_b(RDar7265711 *x) {
1341   id y = [x new_stuff]; // no-warning
1342   [y release];
1343 }
1344
1345 //===----------------------------------------------------------------------===//
1346 // <rdar://problem/7306898> clang thinks [NSCursor dragCopyCursor] returns a
1347 //                          retained reference
1348 //===----------------------------------------------------------------------===//
1349
1350 @interface NSCursor : NSObject
1351 + (NSCursor *)dragCopyCursor;
1352 @end
1353
1354 void rdar7306898(void) {
1355   // 'dragCopyCursor' does not follow Cocoa's fundamental rule.  It is a noun, not an sentence
1356   // implying a 'copy' of something.
1357   NSCursor *c =  [NSCursor dragCopyCursor]; // no-warning
1358   NSNumber *number = [[NSNumber alloc] initWithInt:5]; // expected-warning{{leak}}
1359 }
1360
1361 //===----------------------------------------------------------------------===//
1362 // <rdar://problem/7252064> sending 'release', 'retain', etc. to a Class
1363 // directly is not likely what the user intended
1364 //===----------------------------------------------------------------------===//
1365
1366 @interface RDar7252064 : NSObject @end
1367 void rdar7252064(void) {
1368   [RDar7252064 release]; // expected-warning{{The 'release' message should be sent to instances of class 'RDar7252064' and not the class directly}}
1369   [RDar7252064 retain]; // expected-warning{{The 'retain' message should be sent to instances of class 'RDar7252064' and not the class directly}}
1370   [RDar7252064 autorelease]; // expected-warning{{The 'autorelease' message should be sent to instances of class 'RDar7252064' and not the class directly}}
1371   [NSAutoreleasePool drain]; // expected-warning{{method '+drain' not found}} expected-warning{{The 'drain' message should be sent to instances of class 'NSAutoreleasePool' and not the class directly}}
1372 }
1373
1374 //===----------------------------------------------------------------------===//
1375 // Tests of ownership attributes.
1376 //===----------------------------------------------------------------------===//
1377
1378 typedef NSString* MyStringTy;
1379
1380 @protocol FooP;
1381
1382 @interface TestOwnershipAttr : NSObject
1383 - (NSString*) returnsAnOwnedString  NS_RETURNS_RETAINED; // no-warning
1384 - (NSString*) returnsAnOwnedCFString  CF_RETURNS_RETAINED; // no-warning
1385 - (MyStringTy) returnsAnOwnedTypedString NS_RETURNS_RETAINED; // no-warning
1386 - (NSString*) newString NS_RETURNS_NOT_RETAINED; // no-warning
1387 - (NSString*) newString_auto NS_RETURNS_AUTORELEASED; // no-warning
1388 - (NSString*) newStringNoAttr;
1389 - (int) returnsAnOwnedInt NS_RETURNS_RETAINED; // expected-warning{{'ns_returns_retained' attribute only applies to methods that return an Objective-C object}}
1390 - (id) pseudoInit NS_CONSUMES_SELF NS_RETURNS_RETAINED;
1391 + (void) consume:(id) NS_CONSUMED x;
1392 + (void) consume2:(id) CF_CONSUMED x;
1393 @end
1394
1395 static int ownership_attribute_doesnt_go_here NS_RETURNS_RETAINED; // expected-warning{{'ns_returns_retained' attribute only applies to functions and methods}}
1396
1397 void test_attr_1(TestOwnershipAttr *X) {
1398   NSString *str = [X returnsAnOwnedString]; // expected-warning{{leak}}
1399 }
1400
1401 void test_attr_1b(TestOwnershipAttr *X) {
1402   NSString *str = [X returnsAnOwnedCFString]; // expected-warning{{leak}}
1403 }
1404
1405 void test_attr1c(TestOwnershipAttr *X) {
1406   NSString *str = [X newString]; // no-warning
1407   NSString *str2 = [X newStringNoAttr]; // expected-warning{{leak}}
1408   NSString *str3 = [X newString_auto]; // no-warning
1409   NSString *str4 = [[X newString_auto] retain]; // expected-warning {{leak}}
1410 }
1411
1412 void testattr2_a() {
1413   TestOwnershipAttr *x = [TestOwnershipAttr alloc]; // expected-warning{{leak}}
1414 }
1415
1416 void testattr2_b() {
1417   TestOwnershipAttr *x = [[TestOwnershipAttr alloc] pseudoInit];  // expected-warning{{leak}}
1418 }
1419
1420 void testattr2_b_11358224_self_assign_looses_the_leak() {
1421   TestOwnershipAttr *x = [[TestOwnershipAttr alloc] pseudoInit];// expected-warning{{leak}}
1422   x = x;
1423 }
1424
1425 void testattr2_c() {
1426   TestOwnershipAttr *x = [[TestOwnershipAttr alloc] pseudoInit]; // no-warning
1427   [x release];
1428 }
1429
1430 void testattr3() {
1431   TestOwnershipAttr *x = [TestOwnershipAttr alloc]; // no-warning
1432   [TestOwnershipAttr consume:x];
1433   TestOwnershipAttr *y = [TestOwnershipAttr alloc]; // no-warning
1434   [TestOwnershipAttr consume2:y];
1435 }
1436
1437 void consume_ns(id NS_CONSUMED x);
1438 void consume_cf(id CF_CONSUMED x);
1439
1440 void testattr4() {
1441   TestOwnershipAttr *x = [TestOwnershipAttr alloc]; // no-warning
1442   consume_ns(x);
1443   TestOwnershipAttr *y = [TestOwnershipAttr alloc]; // no-warning
1444   consume_cf(y);
1445 }
1446
1447 @interface TestOwnershipAttr2 : NSObject
1448 - (NSString*) newString NS_RETURNS_NOT_RETAINED; // no-warning
1449 @end
1450
1451 @implementation TestOwnershipAttr2
1452 - (NSString*) newString {
1453   return [NSString alloc]; // expected-warning {{Potential leak of an object}}
1454 }
1455 @end
1456
1457 @interface MyClassTestCFAttr : NSObject {}
1458 - (NSDate*) returnsCFRetained CF_RETURNS_RETAINED;
1459 - (CFDateRef) returnsCFRetainedAsCF CF_RETURNS_RETAINED;
1460 - (CFDateRef) newCFRetainedAsCF CF_RETURNS_NOT_RETAINED;
1461 - (CFDateRef) newCFRetainedAsCFNoAttr CF_RETURNS_RETAINED;
1462 - (NSDate*) alsoReturnsRetained;
1463 - (CFDateRef) alsoReturnsRetainedAsCF CF_RETURNS_NOT_RETAINED;
1464 - (NSDate*) returnsNSRetained NS_RETURNS_RETAINED;
1465 @end
1466
1467 CF_RETURNS_RETAINED
1468 CFDateRef returnsRetainedCFDate()  {
1469   return CFDateCreate(0, CFAbsoluteTimeGetCurrent());
1470 }
1471
1472 @implementation MyClassTestCFAttr
1473 - (NSDate*) returnsCFRetained {
1474   return (NSDate*) returnsRetainedCFDate(); // No leak.
1475 }
1476
1477 - (CFDateRef) returnsCFRetainedAsCF {
1478   return returnsRetainedCFDate(); // No leak.
1479 }
1480
1481 - (CFDateRef) newCFRetainedAsCF {
1482   return (CFDateRef)[(id)[self returnsCFRetainedAsCF] autorelease];
1483 }
1484
1485 - (CFDateRef) newCFRetainedAsCFNoAttr {
1486   return (CFDateRef)[(id)[self returnsCFRetainedAsCF] autorelease]; // expected-warning{{Object with a +0 retain count returned to caller where a +1 (owning) retain count is expected}}
1487 }
1488
1489 - (NSDate*) alsoReturnsRetained {
1490   return (NSDate*) returnsRetainedCFDate(); // expected-warning{{leak}}
1491 }
1492
1493 - (CFDateRef) alsoReturnsRetainedAsCF {
1494   return returnsRetainedCFDate(); // expected-warning{{leak}}
1495 }
1496
1497
1498 - (NSDate*) returnsNSRetained {
1499   return (NSDate*) returnsRetainedCFDate(); // no-warning
1500 }
1501 @end
1502
1503 //===----------------------------------------------------------------------===//
1504 // Test that leaks post-dominated by "panic" functions are not reported.
1505 //
1506 // <rdar://problem/5905851> do not report a leak when post-dominated by a call
1507 // to a noreturn or panic function
1508 //===----------------------------------------------------------------------===//
1509
1510 void panic() __attribute__((noreturn));
1511 void panic_not_in_hardcoded_list() __attribute__((noreturn));
1512
1513 void test_panic_negative() {
1514   signed z = 1;
1515   CFNumberRef value = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &z);  // expected-warning{{leak}}
1516 }
1517
1518 void test_panic_positive() {
1519   signed z = 1;
1520   CFNumberRef value = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &z); // no-warning
1521   panic();
1522 }
1523
1524 void test_panic_neg_2(int x) {
1525   signed z = 1;
1526   CFNumberRef value = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &z); // expected-warning{{leak}}
1527   if (x)
1528     panic();
1529 }
1530
1531 void test_panic_pos_2(int x) {
1532   signed z = 1;
1533   CFNumberRef value = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &z); // no-warning
1534   if (x)
1535     panic();
1536   if (!x) {
1537     // This showed up in <rdar://problem/7796563>, where we silently missed checking
1538     // the function type for noreturn.  "panic()" is a hard-coded known panic function
1539     // that isn't always noreturn.
1540     panic_not_in_hardcoded_list();
1541   }
1542 }
1543
1544 //===----------------------------------------------------------------------===//
1545 // Test uses of blocks (closures)
1546 //===----------------------------------------------------------------------===//
1547
1548 void test_blocks_1_pos(void) {
1549   NSNumber *number = [[NSNumber alloc] initWithInt:5]; // expected-warning{{leak}}
1550   ^{}();
1551 }
1552
1553 void test_blocks_1_indirect_release(void) {
1554   NSNumber *number = [[NSNumber alloc] initWithInt:5]; // no-warning
1555   ^{ [number release]; }();
1556 }
1557
1558 void test_blocks_1_indirect_retain(void) {
1559   // Eventually this should be reported as a leak.
1560   NSNumber *number = [[NSNumber alloc] initWithInt:5]; // no-warning
1561   ^{ [number retain]; }();
1562 }
1563
1564 void test_blocks_1_indirect_release_via_call(void) {
1565   NSNumber *number = [[NSNumber alloc] initWithInt:5]; // no-warning
1566   ^(NSObject *o){ [o release]; }(number);
1567 }
1568
1569 void test_blocks_1_indirect_retain_via_call(void) {
1570   NSNumber *number = [[NSNumber alloc] initWithInt:5]; // expected-warning {{leak}}
1571   ^(NSObject *o){ [o retain]; }(number);
1572 }
1573
1574 //===--------------------------------------------------------------------===//
1575 // Test sending message to super that returns an object alias.  Previously
1576 // this caused a crash in the analyzer.
1577 //===--------------------------------------------------------------------===//
1578
1579 @interface Rdar8015556 : NSObject {} @end
1580 @implementation Rdar8015556
1581 - (id)retain {
1582   return [super retain];
1583 }
1584 @end
1585
1586 // <rdar://problem/8272168> - Correcly handle Class<...> in Cocoa Conventions
1587 // detector.
1588
1589 @protocol Prot_R8272168 @end
1590 Class <Prot_R8272168> GetAClassThatImplementsProt_R8272168();
1591 void r8272168() {
1592   GetAClassThatImplementsProt_R8272168();
1593 }
1594
1595 // Test case for <rdar://problem/8356342>, which in the past triggered
1596 // a false positive.
1597 @interface RDar8356342
1598 - (NSDate*) rdar8356342:(NSDate *)inValue;
1599 @end
1600
1601 @implementation RDar8356342
1602 - (NSDate*) rdar8356342:(NSDate*)inValue {
1603   NSDate *outValue = inValue;
1604   if (outValue == 0)
1605     outValue = [[NSDate alloc] init]; // no-warning
1606
1607   if (outValue != inValue)
1608     [outValue autorelease];
1609
1610   return outValue;
1611 }
1612 @end
1613
1614 // <rdar://problem/8724287> - This test case previously crashed because
1615 // of a bug in BugReporter.
1616 extern const void *CFDictionaryGetValue(CFDictionaryRef theDict, const void *key) CF_RETURNS_NOT_RETAINED;
1617 typedef struct __CFError * CFErrorRef;
1618 extern const CFStringRef kCFErrorUnderlyingErrorKey;
1619 extern CFDictionaryRef CFErrorCopyUserInfo(CFErrorRef err) CF_RETURNS_RETAINED;
1620 static void rdar_8724287(CFErrorRef error)
1621 {
1622     CFErrorRef error_to_dump;
1623
1624     error_to_dump = error;
1625     while (error_to_dump != ((void*)0)) {
1626         CFDictionaryRef info;
1627
1628         info = CFErrorCopyUserInfo(error_to_dump); // expected-warning{{Potential leak of an object}}
1629
1630         if (info != ((void*)0)) {
1631         }
1632
1633         error_to_dump = (CFErrorRef) CFDictionaryGetValue(info, kCFErrorUnderlyingErrorKey);
1634     }
1635 }
1636
1637 // <rdar://problem/9234108> - Make sure the model applies cf_consumed
1638 // correctly in argument positions besides the first.
1639
1640 CF_IMPLICIT_BRIDGING_ENABLED
1641
1642 extern void *CFStringCreate(void);
1643
1644 CF_IMPLICIT_BRIDGING_DISABLED
1645
1646 extern void rdar_9234108_helper(void *key, void * CF_CONSUMED value);
1647 void rdar_9234108() {
1648   rdar_9234108_helper(0, CFStringCreate());
1649 }
1650
1651 // <rdar://problem/9726279> - Make sure that objc_method_family works
1652 // to override naming conventions.
1653 struct TwoDoubles {
1654   double one;
1655   double two;
1656 };
1657 typedef struct TwoDoubles TwoDoubles;
1658
1659 @interface NSValue (Mine)
1660 - (id)_prefix_initWithTwoDoubles:(TwoDoubles)twoDoubles __attribute__((objc_method_family(init)));
1661 @end
1662
1663 @implementation NSValue (Mine)
1664 - (id)_prefix_initWithTwoDoubles:(TwoDoubles)twoDoubles
1665 {
1666   return [self init];
1667 }
1668 @end
1669
1670 void rdar9726279() {
1671   TwoDoubles twoDoubles = { 0.0, 0.0 };
1672   NSValue *value = [[NSValue alloc] _prefix_initWithTwoDoubles:twoDoubles];
1673   [value release];
1674 }
1675
1676 // <rdar://problem/9732321>
1677 // Test camelcase support for CF conventions.  While Core Foundation APIs
1678 // don't use camel casing, other code is allowed to use it.
1679 CFArrayRef camelcase_create_1() {
1680   return CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // no-warning
1681 }
1682
1683 CFArrayRef camelcase_createno() {
1684   return CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // expected-warning {{leak}}
1685 }
1686
1687 CFArrayRef camelcase_copy() {
1688   return CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // no-warning
1689 }
1690
1691 CFArrayRef camelcase_copying() {
1692   return CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // expected-warning {{leak}}
1693 }
1694
1695 CFArrayRef copyCamelCase() {
1696   return CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // no-warning
1697 }
1698
1699 CFArrayRef __copyCamelCase() {
1700   return CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // no-warning
1701 }
1702
1703 CFArrayRef __createCamelCase() {
1704   return CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // no-warning
1705 }
1706
1707 CFArrayRef camel_create() {
1708   return CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // no-warning
1709 }
1710
1711
1712 CFArrayRef camel_creat() {
1713   return CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // expected-warning {{leak}}
1714 }
1715
1716 CFArrayRef camel_copy() {
1717   return CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // no-warning
1718 }
1719
1720 CFArrayRef camel_copyMachine() {
1721   return CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // no-warning
1722 }
1723
1724 CFArrayRef camel_copymachine() {
1725   return CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // expected-warning {{leak}}
1726 }
1727
1728 // rdar://problem/8024350
1729 @protocol F18P
1730 - (id) clone;
1731 @end
1732 @interface F18 : NSObject<F18P> @end
1733 @interface F18(Cat)
1734 - (id) clone NS_RETURNS_RETAINED;
1735 @end
1736
1737 @implementation F18
1738 - (id) clone {
1739   return [F18 alloc];
1740 }
1741 @end
1742
1743 // Radar 6582778.
1744 void rdar6582778(void) {
1745   CFAbsoluteTime t = CFAbsoluteTimeGetCurrent();
1746   CFTypeRef vals[] = { CFDateCreate(0, t) }; // expected-warning {{leak}}
1747 }
1748
1749 CFTypeRef global;
1750
1751 void rdar6582778_2(void) {
1752   CFAbsoluteTime t = CFAbsoluteTimeGetCurrent();
1753   global = CFDateCreate(0, t); // no-warning
1754 }
1755
1756 // <rdar://problem/10232019> - Test that objects passed to containers
1757 // are marked "escaped".
1758
1759 void rdar10232019() {
1760   NSMutableArray *array = [NSMutableArray array];
1761
1762   NSString *string = [[NSString alloc] initWithUTF8String:"foo"];
1763   [array addObject:string];
1764   [string release];
1765
1766   NSString *otherString = [string stringByAppendingString:@"bar"]; // no-warning
1767   NSLog(@"%@", otherString);
1768 }
1769
1770 void rdar10232019_positive() {
1771   NSMutableArray *array = [NSMutableArray array];
1772
1773   NSString *string = [[NSString alloc] initWithUTF8String:"foo"];
1774   [string release];
1775
1776   NSString *otherString = [string stringByAppendingString:@"bar"]; // expected-warning {{Reference-counted object is used after it is release}}
1777   NSLog(@"%@", otherString);
1778 }
1779
1780 // RetainCountChecker support for XPC.
1781 // <rdar://problem/9658496>
1782 typedef void * xpc_object_t;
1783 xpc_object_t _CFXPCCreateXPCObjectFromCFObject(CFTypeRef cf);
1784 void xpc_release(xpc_object_t object);
1785
1786 void rdar9658496() {
1787   CFStringRef cf;
1788   xpc_object_t xpc;
1789   cf = CFStringCreateWithCString( ((CFAllocatorRef)0), "test", kCFStringEncodingUTF8 ); // no-warning
1790   xpc = _CFXPCCreateXPCObjectFromCFObject( cf );
1791   CFRelease(cf);
1792   xpc_release(xpc);
1793 }
1794
1795 // Support annotations with method families.
1796 @interface RDar10824732 : NSObject
1797 - (instancetype)initWithObj:(id CF_CONSUMED)obj;
1798 @end
1799
1800 @implementation RDar10824732
1801 - (instancetype)initWithObj:(id)obj {
1802   [obj release];
1803   return [super init];
1804 }
1805 @end
1806
1807 void rdar_10824732() {
1808   @autoreleasepool {
1809     NSString *obj = @"test";
1810     RDar10824732 *foo = [[RDar10824732 alloc] initWithObj:obj]; // no-warning
1811     [foo release];
1812   }
1813 }
1814
1815 // Stop tracking objects passed to functions, which take callbacks as parameters.
1816 // radar://10973977
1817 typedef int (*CloseCallback) (void *);
1818 void ReaderForIO(CloseCallback ioclose, void *ioctx);
1819 int IOClose(void *context);
1820
1821 @protocol SInS <NSObject>
1822 @end
1823
1824 @interface radar10973977 : NSObject
1825 - (id<SInS>)inputS;
1826 - (void)reader;
1827 @end
1828
1829 @implementation radar10973977
1830 - (void)reader
1831 {
1832     id<SInS> inputS = [[self inputS] retain];
1833     ReaderForIO(IOClose, inputS);
1834 }
1835 - (id<SInS>)inputS
1836 {
1837     return 0;
1838 }
1839 @end
1840
1841 // Object escapes through a selector callback: radar://11398514
1842 extern id NSApp;
1843 @interface MySheetController
1844 - (id<SInS>)inputS;
1845 - (void)showDoSomethingSheetAction:(id)action;
1846 - (void)sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo;
1847 @end
1848
1849 @implementation MySheetController
1850 - (id<SInS>)inputS {
1851     return 0;
1852 }
1853 - (void)showDoSomethingSheetAction:(id)action {
1854   id<SInS> inputS = [[self inputS] retain]; 
1855   [NSApp beginSheet:0
1856          modalForWindow:0
1857          modalDelegate:0
1858          didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:)
1859          contextInfo:(void *)inputS]; // no - warning
1860 }
1861 - (void)sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo {
1862    
1863       id contextObject = (id)contextInfo;
1864       [contextObject release];
1865 }
1866
1867 - (id)copyAutoreleaseRadar13081402 {
1868   id x = [[[NSString alloc] initWithUTF8String:"foo"] autorelease];
1869   [x retain];
1870   return x; // no warning
1871 }
1872
1873 @end
1874 //===----------------------------------------------------------------------===//
1875 // Test returning allocated memory in a struct.
1876 //
1877 // We currently don't have a general way to track pointers that "escape".
1878 // Here we test that RetainCountChecker doesn't get excited about returning
1879 // allocated CF objects in struct fields.
1880 //===----------------------------------------------------------------------===//
1881 void *malloc(size_t);
1882 struct rdar11104566 { CFStringRef myStr; };
1883 struct rdar11104566 test_rdar11104566() {
1884   CFStringRef cf = CFStringCreateWithCString( ((CFAllocatorRef)0), "test", kCFStringEncodingUTF8 ); // no-warning
1885   struct rdar11104566 V;
1886   V.myStr = cf;
1887   return V; // no-warning
1888 }
1889
1890 struct rdar11104566 *test_2_rdar11104566() {
1891   CFStringRef cf = CFStringCreateWithCString( ((CFAllocatorRef)0), "test", kCFStringEncodingUTF8 ); // no-warning
1892   struct rdar11104566 *V = (struct rdar11104566 *) malloc(sizeof(*V));
1893   V->myStr = cf;
1894   return V; // no-warning
1895 }
1896
1897 //===----------------------------------------------------------------------===//
1898 // ObjC literals support.
1899 //===----------------------------------------------------------------------===//
1900
1901 void test_objc_arrays() {
1902     { // CASE ONE -- OBJECT IN ARRAY CREATED DIRECTLY
1903         NSObject *o = [[NSObject alloc] init];
1904         NSArray *a = [[NSArray alloc] initWithObjects:o, (void*)0]; // expected-warning {{leak}}
1905         [o release];
1906         [a description];
1907         [o description];
1908     }
1909
1910     { // CASE TWO -- OBJECT IN ARRAY CREATED BY DUPING AUTORELEASED ARRAY
1911         NSObject *o = [[NSObject alloc] init];
1912         NSArray *a1 = [NSArray arrayWithObjects:o, (void*)0];
1913         NSArray *a2 = [[NSArray alloc] initWithArray:a1]; // expected-warning {{leak}}
1914         [o release];        
1915         [a2 description];
1916         [o description];
1917     }
1918
1919     { // CASE THREE -- OBJECT IN RETAINED @[]
1920         NSObject *o = [[NSObject alloc] init];
1921         NSArray *a3 = [@[o] retain]; // expected-warning {{leak}}
1922         [o release];        
1923         [a3 description];
1924         [o description];
1925     }
1926     
1927     { // CASE FOUR -- OBJECT IN ARRAY CREATED BY DUPING @[]
1928         NSObject *o = [[NSObject alloc] init];
1929         NSArray *a = [[NSArray alloc] initWithArray:@[o]]; // expected-warning {{leak}}
1930         [o release];
1931         
1932         [a description];
1933         [o description];
1934     }
1935     
1936     { // CASE FIVE -- OBJECT IN RETAINED @{}
1937         NSValue *o = [[NSValue alloc] init];
1938         NSDictionary *a = [@{o : o} retain]; // expected-warning {{leak}}
1939         [o release];
1940         
1941         [a description];
1942         [o description];
1943     }
1944 }
1945
1946 void test_objc_integer_literals() {
1947   id value = [@1 retain]; // expected-warning {{leak}}
1948   [value description];
1949 }
1950
1951 void test_objc_boxed_expressions(int x, const char *y) {
1952   id value = [@(x) retain]; // expected-warning {{leak}}
1953   [value description];
1954
1955   value = [@(y) retain]; // expected-warning {{leak}}
1956   [value description];
1957 }
1958
1959 // Test NSLog doesn't escape tracked objects.
1960 void rdar11400885(int y)
1961 {
1962   @autoreleasepool {
1963     NSString *printString;
1964     if(y > 2)
1965       printString = [[NSString alloc] init];
1966     else
1967       printString = [[NSString alloc] init];
1968     NSLog(@"Once %@", printString);
1969     [printString release];
1970     NSLog(@"Again: %@", printString); // expected-warning {{Reference-counted object is used after it is released}}
1971   }
1972 }
1973
1974 id makeCollectableNonLeak() {
1975   extern CFTypeRef CFCreateSomething();
1976
1977   CFTypeRef object = CFCreateSomething(); // +1
1978   CFRetain(object); // +2
1979   id objCObject = NSMakeCollectable(object); // +2
1980   [objCObject release]; // +1
1981   return [objCObject autorelease]; // +0
1982 }
1983
1984
1985 void consumeAndStopTracking(id NS_CONSUMED obj, void (^callback)(void));
1986 void CFConsumeAndStopTracking(CFTypeRef CF_CONSUMED obj, void (^callback)(void));
1987
1988 void testConsumeAndStopTracking() {
1989   id retained = [@[] retain]; // +1
1990   consumeAndStopTracking(retained, ^{}); // no-warning
1991
1992   id doubleRetained = [[@[] retain] retain]; // +2
1993   consumeAndStopTracking(doubleRetained, ^{
1994     [doubleRetained release];
1995   }); // no-warning
1996
1997   id unretained = @[]; // +0
1998   consumeAndStopTracking(unretained, ^{}); // expected-warning {{Incorrect decrement of the reference count of an object that is not owned at this point by the caller}}
1999 }
2000
2001 void testCFConsumeAndStopTracking() {
2002   id retained = [@[] retain]; // +1
2003   CFConsumeAndStopTracking((CFTypeRef)retained, ^{}); // no-warning
2004
2005   id doubleRetained = [[@[] retain] retain]; // +2
2006   CFConsumeAndStopTracking((CFTypeRef)doubleRetained, ^{
2007     [doubleRetained release];
2008   }); // no-warning
2009
2010   id unretained = @[]; // +0
2011   CFConsumeAndStopTracking((CFTypeRef)unretained, ^{}); // expected-warning {{Incorrect decrement of the reference count of an object that is not owned at this point by the caller}}
2012 }
2013 //===----------------------------------------------------------------------===//
2014 // Test 'pragma clang arc_cf_code_audited' support.
2015 //===----------------------------------------------------------------------===//
2016
2017 typedef void *MyCFType;
2018 #pragma clang arc_cf_code_audited begin
2019 MyCFType CreateMyCFType();
2020 #pragma clang arc_cf_code_audited end 
2021     
2022 void test_custom_cf() {
2023   MyCFType x = CreateMyCFType(); // expected-warning {{leak of an object stored into 'x'}}
2024 }
2025
2026 //===----------------------------------------------------------------------===//
2027 // Test calling CFPlugInInstanceCreate, which appears in CF but doesn't
2028 // return a CF object.
2029 //===----------------------------------------------------------------------===//
2030
2031 void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) {
2032   CFPlugInInstanceCreate(kCFAllocatorDefault, factoryUUID, typeUUID); // no-warning
2033 }
2034
2035 //===----------------------------------------------------------------------===//
2036 // PR14927: -drain only has retain-count semantics on NSAutoreleasePool.
2037 //===----------------------------------------------------------------------===//
2038
2039 @interface PR14927 : NSObject
2040 - (void)drain;
2041 @end
2042
2043 void test_drain() {
2044   PR14927 *obj = [[PR14927 alloc] init];
2045   [obj drain];
2046   [obj release]; // no-warning
2047 }
2048
2049 //===----------------------------------------------------------------------===//
2050 // Allow cf_returns_retained and cf_returns_not_retained to mark a return
2051 // value as tracked, even if the object isn't a known CF type.
2052 //===----------------------------------------------------------------------===//
2053
2054 MyCFType getCustom() __attribute__((cf_returns_not_retained));
2055 MyCFType makeCustom() __attribute__((cf_returns_retained));
2056
2057 void testCustomReturnsRetained() {
2058   MyCFType obj = makeCustom(); // expected-warning {{leak of an object stored into 'obj'}}
2059 }
2060
2061 void testCustomReturnsNotRetained() {
2062   CFRelease(getCustom()); // expected-warning {{Incorrect decrement of the reference count of an object that is not owned at this point by the caller}}
2063 }
2064
2065 //===----------------------------------------------------------------------===//
2066 // Don't print variables which are out of the current scope.
2067 //===----------------------------------------------------------------------===//
2068 @interface MyObj12706177 : NSObject
2069 -(instancetype)initX;
2070 +(void)test12706177;
2071 @end
2072 static int Cond;
2073 @implementation MyObj12706177
2074 -(instancetype)initX {
2075   if (Cond)
2076     return 0;
2077   self = [super init];
2078   return self;
2079 }
2080 +(void)test12706177 {
2081   id x = [[MyObj12706177 alloc] initX]; //expected-warning {{Potential leak of an object}}
2082   [x release]; 
2083 }
2084 @end
2085
2086 //===----------------------------------------------------------------------===//
2087 // <rdar://problem/13783514> xpc_connection_set_finalizer_f
2088 //===----------------------------------------------------------------------===//
2089
2090 typedef xpc_object_t xpc_connection_t;
2091 typedef void (*xpc_finalizer_t)(void *value);
2092 void xpc_connection_set_context(xpc_connection_t connection, void *ctx);
2093 void xpc_connection_set_finalizer_f(xpc_connection_t connection,
2094                                     xpc_finalizer_t finalizer);
2095 void releaseAfterXPC(void *context) {
2096   [(NSArray *)context release];
2097 }
2098
2099 void rdar13783514(xpc_connection_t connection) {
2100   xpc_connection_set_context(connection, [[NSMutableArray alloc] init]);
2101   xpc_connection_set_finalizer_f(connection, releaseAfterXPC);
2102 } // no-warning
2103
2104 CFAttributedStringRef CFAttributedCreate(void *CFObj CF_CONSUMED) CF_RETURNS_RETAINED;
2105
2106 @interface Action
2107 @property (nonatomic) SEL action;
2108 @property (nonatomic, assign) id target;
2109 @end