blob: 36bcc48df2b8a1237315fed320b07e4ff06affc8 [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
3
4typedef const void * CFTypeRef;
5extern CFTypeRef CFRetain(CFTypeRef cf);
6extern void CFRelease(CFTypeRef cf);
7
8#define CF_RETURNS_RETAINED __attribute__((cf_returns_retained))
9extern CFTypeRef CFCreate() CF_RETURNS_RETAINED;
10
11using size_t = decltype(sizeof(int));
12
13struct OSObject {
14 virtual void retain();
15 virtual void release();
16
17 static void * operator new(size_t size);
18 virtual ~OSObject(){}
19};
20
21void cf_overrelease() {
22 CFTypeRef cf = CFCreate();
23 CFRelease(cf);
24 CFRelease(cf);
25#ifndef NO_CF_OBJECT
26 // expected-warning@-2{{Reference-counted object is used after it is released}}
27#endif
28}
29
30void osobject_overrelease() {
31 OSObject *o = new OSObject;
32 o->release();
33 o->release();
34#ifndef NO_OS_OBJECT
35 // expected-warning@-2{{Reference-counted object is used after it is released}}
36#endif
37}