1 // RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.cplusplus.NewDelete,unix.Malloc -analyzer-store region -std=c++11 -fblocks -verify %s
2 #include "Inputs/system-header-simulator-cxx.h"
3 
4 void *allocator(std::size_t size);
5 
6 void *operator new[](std::size_t size) throw() { return allocator(size); }
7 void *operator new(std::size_t size) throw() { return allocator(size); }
8 void *operator new(std::size_t size, std::nothrow_t& nothrow) throw() { return allocator(size); }
9 void *operator new(std::size_t, double d);
10 
11 class C {
12 public:
13   void *operator new(std::size_t);
14 };
15 
16 void testNewMethod() {
17   void *p1 = C::operator new(0); // no warn
18 
19   C *p2 = new C; // no warn
20 
21   C *c3 = ::new C;
22 } // expected-warning{{Memory is never released; potential leak}}
23 
24 void testOpNewArray() {
25   void *p = operator new[](0); // call is inlined, no warn
26 }
27 
28 void testNewExprArray() {
29   int *p = new int[0];
30 } // expected-warning{{Memory is never released; potential leak}}
31 
32 //----- Custom non-placement operators
33 void testOpNew() {
34   void *p = operator new(0); // call is inlined, no warn
35 }
36 
37 void testNewExpr() {
38   int *p = new int;
39 } // expected-warning{{Memory is never released; potential leak}}
40 
41 //----- Custom NoThrow placement operators
42 void testOpNewNoThrow() {
43   void *p = operator new(0, std::nothrow);
44 } // expected-warning{{Memory is never released; potential leak}}
45 
46 void testNewExprNoThrow() {
47   int *p = new(std::nothrow) int;
48 } // expected-warning{{Memory is never released; potential leak}}
49 
50 //----- Custom placement operators
51 void testOpNewPlacement() {
52   void *p = operator new(0, 0.1); // no warn
53 }
54 
55 void testNewExprPlacement() {
56   int *p = new(0.1) int; // no warn
57 }
58