diff options
Diffstat (limited to 'test/Analysis/NewDeleteLeaks-PR19102.cpp')
-rw-r--r-- | test/Analysis/NewDeleteLeaks-PR19102.cpp | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/test/Analysis/NewDeleteLeaks-PR19102.cpp b/test/Analysis/NewDeleteLeaks-PR19102.cpp new file mode 100644 index 000000000000..b141301e456f --- /dev/null +++ b/test/Analysis/NewDeleteLeaks-PR19102.cpp @@ -0,0 +1,43 @@ +// RUN: %clang_cc1 -analyze -analyzer-checker=core,cplusplus.NewDeleteLeaks -verify %s + +class A0 {}; + +class A1 { +public: + A1(int); +}; + +struct S{ + int i; +}; + +class A2 { +public: + A2(); + A2(S); + A2(int*); + A2(S*); + A2(S&, int); + A2(int, S**); +}; + +void test() { + new int; // expected-warning@+1 {{Potential memory leak}} + new A0; // expected-warning@+1 {{Potential memory leak}} + new A1(0); // expected-warning@+1 {{Potential memory leak}} + new A2; // expected-warning@+1 {{Potential memory leak}} + S s; + s.i = 1; + S* ps = new S; + new A2(s); // expected-warning@+1 {{Potential memory leak}} + new A2(&(s.i)); // expected-warning@+1 {{Potential memory leak}} + new A2(ps); // no warning + new A2(*ps, 1); // no warning + new A2(1, &ps); // no warning + + // Tests to ensure that leaks are reported for consumed news no matter what the arguments are. + A2 *a2p1 = new A2; // expected-warning@+1 {{Potential leak of memory}} + A2 *a2p2 = new A2(ps); // expected-warning@+1 {{Potential leak of memory}} + A2 *a2p3 = new A2(*ps, 1); // expected-warning@+1 {{Potential leak of memory}} + A2 *a2p4 = new A2(1, &ps); // expected-warning@+1 {{Potential leak of memory}} +} |