1 | // RUN: %clang_analyze_cc1 -analyzer-checker=core,cplusplus.NewDeleteLeaks -verify %s |
2 | // RUN: %clang_analyze_cc1 -analyzer-checker=core,cplusplus.NewDeleteLeaks -analyzer-config c++-allocator-inlining=true -verify %s |
3 | |
4 | class A0 {}; |
5 | |
6 | class A1 { |
7 | public: |
8 | A1(int); |
9 | }; |
10 | |
11 | struct S{ |
12 | int i; |
13 | }; |
14 | |
15 | class A2 { |
16 | public: |
17 | A2(); |
18 | A2(S); |
19 | A2(int*); |
20 | A2(S*); |
21 | A2(S&, int); |
22 | A2(int, S**); |
23 | }; |
24 | |
25 | void test() { |
26 | new int; // expected-warning@+1 {{Potential memory leak}} |
27 | new A0; // expected-warning@+1 {{Potential memory leak}} |
28 | new A1(0); // expected-warning@+1 {{Potential memory leak}} |
29 | new A2; // expected-warning@+1 {{Potential memory leak}} |
30 | S s; |
31 | s.i = 1; |
32 | S* ps = new S; |
33 | new A2(s); // expected-warning@+1 {{Potential memory leak}} |
34 | new A2(&(s.i)); // expected-warning@+1 {{Potential memory leak}} |
35 | new A2(ps); // no warning |
36 | new A2(*ps, 1); // no warning |
37 | new A2(1, &ps); // no warning |
38 | |
39 | // Tests to ensure that leaks are reported for consumed news no matter what the arguments are. |
40 | A2 *a2p1 = new A2; // expected-warning@+1 {{Potential leak of memory}} |
41 | A2 *a2p2 = new A2(ps); // expected-warning@+1 {{Potential leak of memory}} |
42 | A2 *a2p3 = new A2(*ps, 1); // expected-warning@+1 {{Potential leak of memory}} |
43 | A2 *a2p4 = new A2(1, &ps); // expected-warning@+1 {{Potential leak of memory}} |
44 | } |
45 | |