blob: 0835c88cf919e475f4ea0ff7a6be189a82bebfba [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
George Karpenkov2c2d0b62019-01-18 19:24:55 +00005#include "os_object_base.h"
6
George Karpenkov27db3302018-12-07 20:21:51 +00007typedef const void * CFTypeRef;
8extern CFTypeRef CFRetain(CFTypeRef cf);
9extern void CFRelease(CFTypeRef cf);
10
11#define CF_RETURNS_RETAINED __attribute__((cf_returns_retained))
12extern CFTypeRef CFCreate() CF_RETURNS_RETAINED;
13
14using size_t = decltype(sizeof(int));
15
George Karpenkov27db3302018-12-07 20:21:51 +000016void cf_overrelease() {
17 CFTypeRef cf = CFCreate();
18 CFRelease(cf);
19 CFRelease(cf);
20#ifndef NO_CF_OBJECT
21 // expected-warning@-2{{Reference-counted object is used after it is released}}
22#endif
23}
24
25void osobject_overrelease() {
26 OSObject *o = new OSObject;
27 o->release();
28 o->release();
29#ifndef NO_OS_OBJECT
30 // expected-warning@-2{{Reference-counted object is used after it is released}}
31#endif
32}