blob: be6534f544bddaea5c05f2d4b16e1f5078a0be91 [file] [log] [blame]
George Karpenkov27db3302018-12-07 20:21:51 +00001// RUN: %clang_analyze_cc1 -analyzer-checker=core,osx -analyzer-disable-checker osx.cocoa.RetainCount -DNO_CF_OBJECT -verify %s
2// RUN: %clang_analyze_cc1 -analyzer-checker=core,osx -analyzer-disable-checker osx.OSObjectRetainCount -DNO_OS_OBJECT -verify %s
George Karpenkovd1081ec2018-12-11 01:13:58 +00003// RUN: %clang_analyze_cc1 -analyzer-checker=core,osx -analyzer-config "osx.cocoa.RetainCount:CheckOSObject=false" -DNO_OS_OBJECT -verify %s
George Karpenkov27db3302018-12-07 20:21:51 +00004
5typedef const void * CFTypeRef;
6extern CFTypeRef CFRetain(CFTypeRef cf);
7extern void CFRelease(CFTypeRef cf);
8
9#define CF_RETURNS_RETAINED __attribute__((cf_returns_retained))
10extern CFTypeRef CFCreate() CF_RETURNS_RETAINED;
11
12using size_t = decltype(sizeof(int));
13
Vlad Tsyrklevichd5dd6a52019-01-18 08:43:22 +000014struct OSObject {
15 virtual void retain();
16 virtual void release();
17
18 static void * operator new(size_t size);
19 virtual ~OSObject(){}
20};
21
George Karpenkov27db3302018-12-07 20:21:51 +000022void cf_overrelease() {
23 CFTypeRef cf = CFCreate();
24 CFRelease(cf);
25 CFRelease(cf);
26#ifndef NO_CF_OBJECT
27 // expected-warning@-2{{Reference-counted object is used after it is released}}
28#endif
29}
30
31void osobject_overrelease() {
32 OSObject *o = new OSObject;
33 o->release();
34 o->release();
35#ifndef NO_OS_OBJECT
36 // expected-warning@-2{{Reference-counted object is used after it is released}}
37#endif
38}