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