// 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}} }