1*06f32e7eSjoerg // C, C++
test()2*06f32e7eSjoerg void test() {
3*06f32e7eSjoerg   int *p = (int *)malloc(sizeof(int));
4*06f32e7eSjoerg   delete p; // warn
5*06f32e7eSjoerg }
6*06f32e7eSjoerg 
7*06f32e7eSjoerg // C, C++
8*06f32e7eSjoerg void __attribute((ownership_returns(malloc))) *user_malloc(size_t);
9*06f32e7eSjoerg 
test()10*06f32e7eSjoerg void test() {
11*06f32e7eSjoerg   int *p = (int *)user_malloc(sizeof(int));
12*06f32e7eSjoerg   delete p; // warn
13*06f32e7eSjoerg }
14*06f32e7eSjoerg 
15*06f32e7eSjoerg // C, C++
test()16*06f32e7eSjoerg void test() {
17*06f32e7eSjoerg   int *p = new int;
18*06f32e7eSjoerg   free(p); // warn
19*06f32e7eSjoerg }
20*06f32e7eSjoerg 
21*06f32e7eSjoerg // C, C++
test()22*06f32e7eSjoerg void test() {
23*06f32e7eSjoerg   int *p = new int[1];
24*06f32e7eSjoerg   realloc(p, sizeof(long)); // warn
25*06f32e7eSjoerg }
26*06f32e7eSjoerg 
27*06f32e7eSjoerg // C, C++
28*06f32e7eSjoerg template <typename T>
29*06f32e7eSjoerg struct SimpleSmartPointer {
30*06f32e7eSjoerg   T *ptr;
31*06f32e7eSjoerg 
SimpleSmartPointerSimpleSmartPointer32*06f32e7eSjoerg   explicit SimpleSmartPointer(T *p = 0) : ptr(p) {}
~SimpleSmartPointerSimpleSmartPointer33*06f32e7eSjoerg   ~SimpleSmartPointer() {
34*06f32e7eSjoerg     delete ptr; // warn
35*06f32e7eSjoerg   }
36*06f32e7eSjoerg };
37*06f32e7eSjoerg 
test()38*06f32e7eSjoerg void test() {
39*06f32e7eSjoerg   SimpleSmartPointer<int> a((int *)malloc(4));
40*06f32e7eSjoerg }
41*06f32e7eSjoerg 
42*06f32e7eSjoerg // C++
test()43*06f32e7eSjoerg void test() {
44*06f32e7eSjoerg   int *p = (int *)operator new(0);
45*06f32e7eSjoerg   delete[] p; // warn
46*06f32e7eSjoerg }
47*06f32e7eSjoerg 
48*06f32e7eSjoerg // Objective-C, C++
test(NSUInteger dataLength)49*06f32e7eSjoerg void test(NSUInteger dataLength) {
50*06f32e7eSjoerg   int *p = new int;
51*06f32e7eSjoerg   NSData *d = [NSData dataWithBytesNoCopy:p
52*06f32e7eSjoerg                length:sizeof(int) freeWhenDone:1];
53*06f32e7eSjoerg     // warn +dataWithBytesNoCopy:length:freeWhenDone: cannot take
54*06f32e7eSjoerg     // ownership of memory allocated by 'new'
55*06f32e7eSjoerg }
56*06f32e7eSjoerg 
57