blob: 2dadb210faec04c78befdfded2e581d09ec1c120 [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
2// RUN: %clang_cc1 -analyze -analyzer-checker=core,cplusplus.NewDelete,alpha.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
30// expected-warning@-2{{Memory is never released; potential leak}}
31#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
41// expected-warning@-2{{Memory is never released; potential leak}}
42#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
54// expected-warning@-2{{Memory is never released; potential leak}}
55#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
63// expected-warning@-2{{Memory is never released; potential leak}}
64#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
70// expected-warning@-2{{Memory is never released; potential leak}}
71#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}