blob: 5fda2b2e221124109631809ed7b11eefd9b3b393 [file] [log] [blame]
Kristof Umann8fd74eb2019-01-26 20:06:54 +00001// RUN: %clang_analyze_cc1 -DNO_CF_OBJECT -verify %s \
2// RUN: -analyzer-checker=core,osx \
3// RUN: -analyzer-disable-checker osx.cocoa.RetainCount
4//
5// RUN: %clang_analyze_cc1 -DNO_OS_OBJECT -verify %s \
6// RUN: -analyzer-checker=core,osx \
7// RUN: -analyzer-disable-checker osx.OSObjectRetainCount
8//
9// RUN: %clang_analyze_cc1 -DNO_OS_OBJECT -verify %s \
10// RUN: -analyzer-checker=core,osx \
11// RUN: -analyzer-config "osx.cocoa.RetainCount:CheckOSObject=false"
George Karpenkov27db3302018-12-07 20:21:51 +000012
George Karpenkov2c2d0b62019-01-18 19:24:55 +000013#include "os_object_base.h"
14
George Karpenkov27db3302018-12-07 20:21:51 +000015typedef const void * CFTypeRef;
16extern CFTypeRef CFRetain(CFTypeRef cf);
17extern void CFRelease(CFTypeRef cf);
18
19#define CF_RETURNS_RETAINED __attribute__((cf_returns_retained))
20extern CFTypeRef CFCreate() CF_RETURNS_RETAINED;
21
22using size_t = decltype(sizeof(int));
23
George Karpenkov27db3302018-12-07 20:21:51 +000024void cf_overrelease() {
25 CFTypeRef cf = CFCreate();
26 CFRelease(cf);
27 CFRelease(cf);
28#ifndef NO_CF_OBJECT
29 // expected-warning@-2{{Reference-counted object is used after it is released}}
30#endif
31}
32
33void osobject_overrelease() {
34 OSObject *o = new OSObject;
35 o->release();
36 o->release();
37#ifndef NO_OS_OBJECT
38 // expected-warning@-2{{Reference-counted object is used after it is released}}
39#endif
40}