1 // RUN: %clang_cc1 -analyze -analyzer-checker=core,cplusplus.NewDelete,unix.Malloc -std=c++11 -fblocks -verify %s
2 // RUN: %clang_cc1 -analyze -analyzer-checker=core,cplusplus.NewDelete,cplusplus.NewDeleteLeaks,unix.Malloc -std=c++11 -DLEAKS -fblocks -verify %s
3 #include "Inputs/system-header-simulator-cxx.h"
4
5 #ifndef LEAKS
6 // expected-no-diagnostics
7 #endif
8
9
10 void *allocator(std::size_t size);
11
operator new[](std::size_t size)12 void *operator new[](std::size_t size) throw() { return allocator(size); }
operator new(std::size_t size)13 void *operator new(std::size_t size) throw() { return allocator(size); }
operator new(std::size_t size,std::nothrow_t & nothrow)14 void *operator new(std::size_t size, std::nothrow_t& nothrow) throw() { return allocator(size); }
15 void *operator new(std::size_t, double d);
16
17 class C {
18 public:
19 void *operator new(std::size_t);
20 };
21
testNewMethod()22 void testNewMethod() {
23 void *p1 = C::operator new(0); // no warn
24
25 C *p2 = new C; // no warn
26
27 C *c3 = ::new C;
28 }
29 #ifdef LEAKS
30 // expected-warning@-2{{Potential leak of memory pointed to by 'c3'}}
31 #endif
32
testOpNewArray()33 void testOpNewArray() {
34 void *p = operator new[](0); // call is inlined, no warn
35 }
36
testNewExprArray()37 void testNewExprArray() {
38 int *p = new int[0];
39 }
40 #ifdef LEAKS
41 // expected-warning@-2{{Potential leak of memory pointed to by 'p'}}
42 #endif
43
44
45 //----- Custom non-placement operators
testOpNew()46 void testOpNew() {
47 void *p = operator new(0); // call is inlined, no warn
48 }
49
testNewExpr()50 void testNewExpr() {
51 int *p = new int;
52 }
53 #ifdef LEAKS
54 // expected-warning@-2{{Potential leak of memory pointed to by 'p'}}
55 #endif
56
57
58 //----- Custom NoThrow placement operators
testOpNewNoThrow()59 void testOpNewNoThrow() {
60 void *p = operator new(0, std::nothrow);
61 }
62 #ifdef LEAKS
63 // expected-warning@-2{{Potential leak of memory pointed to by 'p'}}
64 #endif
65
testNewExprNoThrow()66 void testNewExprNoThrow() {
67 int *p = new(std::nothrow) int;
68 }
69 #ifdef LEAKS
70 // expected-warning@-2{{Potential leak of memory pointed to by 'p'}}
71 #endif
72
73 //----- Custom placement operators
testOpNewPlacement()74 void testOpNewPlacement() {
75 void *p = operator new(0, 0.1); // no warn
76 }
77
testNewExprPlacement()78 void testNewExprPlacement() {
79 int *p = new(0.1) int; // no warn
80 }
81