blob: d368889c968e8d2c1e06914b4bfbd1e024a7f7a2 [file] [log] [blame]
Jordan Rosee449edc2013-04-05 17:55:07 +00001// RUN: %clang_cc1 -analyze -analyzer-checker=core,cplusplus.NewDelete,unix.Malloc -std=c++11 -fblocks -verify %s
Stephen Hines176edba2014-12-01 14:53:08 -08002// RUN: %clang_cc1 -analyze -analyzer-checker=core,cplusplus.NewDelete,cplusplus.NewDeleteLeaks,unix.Malloc -std=c++11 -DLEAKS -fblocks -verify %s
Anton Yartsev69746282013-03-28 16:10:38 +00003#include "Inputs/system-header-simulator-cxx.h"
4
Jordan Rosee85deb32013-04-05 17:55:00 +00005#ifndef LEAKS
6// expected-no-diagnostics
7#endif
8
9
Anton Yartsev69746282013-03-28 16:10:38 +000010void *allocator(std::size_t size);
11
12void *operator new[](std::size_t size) throw() { return allocator(size); }
13void *operator new(std::size_t size) throw() { return allocator(size); }
14void *operator new(std::size_t size, std::nothrow_t& nothrow) throw() { return allocator(size); }
15void *operator new(std::size_t, double d);
16
17class C {
18public:
19 void *operator new(std::size_t);
20};
21
22void testNewMethod() {
23 void *p1 = C::operator new(0); // no warn
24
25 C *p2 = new C; // no warn
26
27 C *c3 = ::new C;
Jordan Rosee85deb32013-04-05 17:55:00 +000028}
29#ifdef LEAKS
Anna Zaks68eb4c22013-04-06 00:41:36 +000030// expected-warning@-2{{Potential leak of memory pointed to by 'c3'}}
Jordan Rosee85deb32013-04-05 17:55:00 +000031#endif
Anton Yartsev69746282013-03-28 16:10:38 +000032
33void testOpNewArray() {
Anton Yartsev8e452e72013-03-30 00:50:37 +000034 void *p = operator new[](0); // call is inlined, no warn
35}
Anton Yartsev69746282013-03-28 16:10:38 +000036
37void testNewExprArray() {
38 int *p = new int[0];
Jordan Rosee85deb32013-04-05 17:55:00 +000039}
40#ifdef LEAKS
Anna Zaks68eb4c22013-04-06 00:41:36 +000041// expected-warning@-2{{Potential leak of memory pointed to by 'p'}}
Jordan Rosee85deb32013-04-05 17:55:00 +000042#endif
43
Anton Yartsev69746282013-03-28 16:10:38 +000044
45//----- Custom non-placement operators
46void testOpNew() {
Anton Yartsev8e452e72013-03-30 00:50:37 +000047 void *p = operator new(0); // call is inlined, no warn
48}
Anton Yartsev69746282013-03-28 16:10:38 +000049
50void testNewExpr() {
51 int *p = new int;
Jordan Rosee85deb32013-04-05 17:55:00 +000052}
53#ifdef LEAKS
Anna Zaks68eb4c22013-04-06 00:41:36 +000054// expected-warning@-2{{Potential leak of memory pointed to by 'p'}}
Jordan Rosee85deb32013-04-05 17:55:00 +000055#endif
56
Anton Yartsev69746282013-03-28 16:10:38 +000057
58//----- Custom NoThrow placement operators
59void testOpNewNoThrow() {
60 void *p = operator new(0, std::nothrow);
Jordan Rosee85deb32013-04-05 17:55:00 +000061}
62#ifdef LEAKS
Anna Zaks68eb4c22013-04-06 00:41:36 +000063// expected-warning@-2{{Potential leak of memory pointed to by 'p'}}
Jordan Rosee85deb32013-04-05 17:55:00 +000064#endif
Anton Yartsev69746282013-03-28 16:10:38 +000065
66void testNewExprNoThrow() {
67 int *p = new(std::nothrow) int;
Jordan Rosee85deb32013-04-05 17:55:00 +000068}
69#ifdef LEAKS
Anna Zaks68eb4c22013-04-06 00:41:36 +000070// expected-warning@-2{{Potential leak of memory pointed to by 'p'}}
Jordan Rosee85deb32013-04-05 17:55:00 +000071#endif
Anton Yartsev69746282013-03-28 16:10:38 +000072
73//----- Custom placement operators
74void testOpNewPlacement() {
75 void *p = operator new(0, 0.1); // no warn
76}
77
78void testNewExprPlacement() {
79 int *p = new(0.1) int; // no warn
80}