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