NewDelete-custom.cpp revision 3d11708c491a96198ebfee49079ae458ed90eaf8
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
4void *allocator(std::size_t size);
5
6void *operator new[](std::size_t size) throw() { return allocator(size); }
7void *operator new(std::size_t size) throw() { return allocator(size); }
8void *operator new(std::size_t size, std::nothrow_t& nothrow) throw() { return allocator(size); }
9void *operator new(std::size_t, double d);
10
11class C {
12public:
13  void *operator new(std::size_t);
14};
15
16void 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
24void testOpNewArray() {
25  void *p = operator new[](0); // call is inlined, no warn
26}
27
28void testNewExprArray() {
29  int *p = new int[0];
30} // expected-warning{{Memory is never released; potential leak}}
31
32//----- Custom non-placement operators
33void testOpNew() {
34  void *p = operator new(0); // call is inlined, no warn
35}
36
37void testNewExpr() {
38  int *p = new int;
39} // expected-warning{{Memory is never released; potential leak}}
40
41//----- Custom NoThrow placement operators
42void testOpNewNoThrow() {
43  void *p = operator new(0, std::nothrow);
44} // expected-warning{{Memory is never released; potential leak}}
45
46void testNewExprNoThrow() {
47  int *p = new(std::nothrow) int;
48} // expected-warning{{Memory is never released; potential leak}}
49
50//----- Custom placement operators
51void testOpNewPlacement() {
52  void *p = operator new(0, 0.1); // no warn
53}
54
55void testNewExprPlacement() {
56  int *p = new(0.1) int; // no warn
57}
58