1bef9f8aaSArtem Dergachev // RUN: %clang_analyze_cc1 -w -verify %s\
2bef9f8aaSArtem Dergachev // RUN:   -analyzer-checker=core,unix.Malloc,cplusplus.NewDeleteLeaks\
3bef9f8aaSArtem Dergachev // RUN:   -analyzer-checker=debug.ExprInspection -std=c++11
4bef9f8aaSArtem Dergachev // RUN: %clang_analyze_cc1 -w -verify %s\
5bef9f8aaSArtem Dergachev // RUN:   -analyzer-checker=core,unix.Malloc,cplusplus.NewDeleteLeaks\
6bef9f8aaSArtem Dergachev // RUN:   -analyzer-checker=debug.ExprInspection -std=c++17
7bef9f8aaSArtem Dergachev // RUN: %clang_analyze_cc1 -w -verify %s\
8bef9f8aaSArtem Dergachev // RUN:   -analyzer-checker=core,unix.Malloc,cplusplus.NewDeleteLeaks\
9bef9f8aaSArtem Dergachev // RUN:   -analyzer-checker=debug.ExprInspection -std=c++11\
10bef9f8aaSArtem Dergachev // RUN:   -DTEST_INLINABLE_ALLOCATORS
11bef9f8aaSArtem Dergachev // RUN: %clang_analyze_cc1 -w -verify %s\
12bef9f8aaSArtem Dergachev // RUN:   -analyzer-checker=core,unix.Malloc,cplusplus.NewDeleteLeaks\
13bef9f8aaSArtem Dergachev // RUN:   -analyzer-checker=debug.ExprInspection -std=c++17\
14bef9f8aaSArtem Dergachev // RUN:   -DTEST_INLINABLE_ALLOCATORS
156d5a8caaSJordy Rose 
166d5a8caaSJordy Rose void clang_analyzer_eval(bool);
171ade3267SZhongxing Xu 
1859428d18SArtem Dergachev #include "Inputs/system-header-simulator-cxx.h"
1959428d18SArtem Dergachev 
201ade3267SZhongxing Xu class A {
211ade3267SZhongxing Xu   int x;
221ade3267SZhongxing Xu public:
231ade3267SZhongxing Xu   A();
241ade3267SZhongxing Xu };
251ade3267SZhongxing Xu 
A()261ade3267SZhongxing Xu A::A() : x(0) {
276d5a8caaSJordy Rose   clang_analyzer_eval(x == 0); // expected-warning{{TRUE}}
281ade3267SZhongxing Xu }
2954529a34SJordan Rose 
3054529a34SJordan Rose 
3154529a34SJordan Rose class DirectMember {
3254529a34SJordan Rose   int x;
3354529a34SJordan Rose public:
DirectMember(int value)3454529a34SJordan Rose   DirectMember(int value) : x(value) {}
3554529a34SJordan Rose 
getX()3654529a34SJordan Rose   int getX() { return x; }
3754529a34SJordan Rose };
3854529a34SJordan Rose 
testDirectMember()3954529a34SJordan Rose void testDirectMember() {
4054529a34SJordan Rose   DirectMember obj(3);
4154529a34SJordan Rose   clang_analyzer_eval(obj.getX() == 3); // expected-warning{{TRUE}}
4254529a34SJordan Rose }
4354529a34SJordan Rose 
4454529a34SJordan Rose 
4554529a34SJordan Rose class IndirectMember {
4654529a34SJordan Rose   struct {
4754529a34SJordan Rose     int x;
4854529a34SJordan Rose   };
4954529a34SJordan Rose public:
IndirectMember(int value)5054529a34SJordan Rose   IndirectMember(int value) : x(value) {}
5154529a34SJordan Rose 
getX()5254529a34SJordan Rose   int getX() { return x; }
5354529a34SJordan Rose };
5454529a34SJordan Rose 
testIndirectMember()5554529a34SJordan Rose void testIndirectMember() {
5654529a34SJordan Rose   IndirectMember obj(3);
5754529a34SJordan Rose   clang_analyzer_eval(obj.getX() == 3); // expected-warning{{TRUE}}
5854529a34SJordan Rose }
599a2eec38SJordan Rose 
609a2eec38SJordan Rose 
6117a8757aSJordan Rose struct DelegatingConstructor {
6217a8757aSJordan Rose   int x;
DelegatingConstructorDelegatingConstructor6317a8757aSJordan Rose   DelegatingConstructor(int y) { x = y; }
DelegatingConstructorDelegatingConstructor6417a8757aSJordan Rose   DelegatingConstructor() : DelegatingConstructor(42) {}
6517a8757aSJordan Rose };
6617a8757aSJordan Rose 
testDelegatingConstructor()6717a8757aSJordan Rose void testDelegatingConstructor() {
6817a8757aSJordan Rose   DelegatingConstructor obj;
6917a8757aSJordan Rose   clang_analyzer_eval(obj.x == 42); // expected-warning{{TRUE}}
7017a8757aSJordan Rose }
7117a8757aSJordan Rose 
7217a8757aSJordan Rose 
739a2eec38SJordan Rose struct RefWrapper {
RefWrapperRefWrapper749a2eec38SJordan Rose   RefWrapper(int *p) : x(*p) {}
RefWrapperRefWrapper759a2eec38SJordan Rose   RefWrapper(int &r) : x(r) {}
769a2eec38SJordan Rose   int &x;
779a2eec38SJordan Rose };
789a2eec38SJordan Rose 
testReferenceMember()799a2eec38SJordan Rose void testReferenceMember() {
809a2eec38SJordan Rose   int *p = 0;
81219c9d0dSJordan Rose   RefWrapper X(p); // expected-warning@-7 {{Dereference of null pointer}}
829a2eec38SJordan Rose }
839a2eec38SJordan Rose 
testReferenceMember2()849a2eec38SJordan Rose void testReferenceMember2() {
859a2eec38SJordan Rose   int *p = 0;
869e0da9e0SAnna Zaks   RefWrapper X(*p); // expected-warning {{Forming reference to null pointer}}
879a2eec38SJordan Rose }
880a0aa84dSJordan Rose 
890a0aa84dSJordan Rose 
900a0aa84dSJordan Rose extern "C" char *strdup(const char *);
910a0aa84dSJordan Rose 
920a0aa84dSJordan Rose class StringWrapper {
930a0aa84dSJordan Rose   char *str;
940a0aa84dSJordan Rose public:
StringWrapper(const char * input)950a0aa84dSJordan Rose   StringWrapper(const char *input) : str(strdup(input)) {} // no-warning
960a0aa84dSJordan Rose };
979853371fSJordan Rose 
989853371fSJordan Rose 
999853371fSJordan Rose // PR15070 - Constructing a type containing a non-POD array mistakenly
1009853371fSJordan Rose // tried to perform a bind instead of relying on the CXXConstructExpr,
1019853371fSJordan Rose // which caused a cast<> failure in RegionStore.
1029853371fSJordan Rose namespace DefaultConstructorWithCleanups {
1039853371fSJordan Rose   class Element {
1049853371fSJordan Rose   public:
1059853371fSJordan Rose     int value;
1069853371fSJordan Rose 
1079853371fSJordan Rose     class Helper {
1089853371fSJordan Rose     public:
1099853371fSJordan Rose       ~Helper();
1109853371fSJordan Rose     };
1119853371fSJordan Rose     Element(Helper h = Helper());
1129853371fSJordan Rose   };
1139853371fSJordan Rose   class Wrapper {
1149853371fSJordan Rose   public:
1159853371fSJordan Rose     Element arr[2];
1169853371fSJordan Rose 
1179853371fSJordan Rose     Wrapper();
1189853371fSJordan Rose   };
1199853371fSJordan Rose 
Wrapper()1209853371fSJordan Rose   Wrapper::Wrapper() /* initializers synthesized */ {}
1219853371fSJordan Rose 
test()1229853371fSJordan Rose   int test() {
1239853371fSJordan Rose     Wrapper w;
1249853371fSJordan Rose     return w.arr[0].value; // no-warning
1259853371fSJordan Rose   }
1269853371fSJordan Rose }
1275f6c173eSJordan Rose 
1285f6c173eSJordan Rose namespace DefaultMemberInitializers {
1295f6c173eSJordan Rose   struct Wrapper {
1305f6c173eSJordan Rose     int value = 42;
1315f6c173eSJordan Rose 
WrapperDefaultMemberInitializers::Wrapper1325f6c173eSJordan Rose     Wrapper() {}
WrapperDefaultMemberInitializers::Wrapper1335f6c173eSJordan Rose     Wrapper(int x) : value(x) {}
WrapperDefaultMemberInitializers::Wrapper1345f6c173eSJordan Rose     Wrapper(bool) {}
1355f6c173eSJordan Rose   };
1365f6c173eSJordan Rose 
test()1375f6c173eSJordan Rose   void test() {
1385f6c173eSJordan Rose     Wrapper w1;
1395f6c173eSJordan Rose     clang_analyzer_eval(w1.value == 42); // expected-warning{{TRUE}}
1405f6c173eSJordan Rose 
1415f6c173eSJordan Rose     Wrapper w2(50);
1425f6c173eSJordan Rose     clang_analyzer_eval(w2.value == 50); // expected-warning{{TRUE}}
1435f6c173eSJordan Rose 
1445f6c173eSJordan Rose     Wrapper w3(false);
1455f6c173eSJordan Rose     clang_analyzer_eval(w3.value == 42); // expected-warning{{TRUE}}
1465f6c173eSJordan Rose   }
1475f6c173eSJordan Rose 
1485f6c173eSJordan Rose   struct StringWrapper {
1495f6c173eSJordan Rose     const char s[4] = "abc";
1505f6c173eSJordan Rose     const char *p = "xyz";
1515f6c173eSJordan Rose 
StringWrapperDefaultMemberInitializers::StringWrapper1525f6c173eSJordan Rose     StringWrapper(bool) {}
1535f6c173eSJordan Rose   };
1545f6c173eSJordan Rose 
testString()1555f6c173eSJordan Rose   void testString() {
1565f6c173eSJordan Rose     StringWrapper w(true);
1575f6c173eSJordan Rose     clang_analyzer_eval(w.s[1] == 'b'); // expected-warning{{TRUE}}
1585f6c173eSJordan Rose     clang_analyzer_eval(w.p[1] == 'y'); // expected-warning{{TRUE}}
1595f6c173eSJordan Rose   }
1605f6c173eSJordan Rose }
161412c0af2SDevin Coughlin 
162412c0af2SDevin Coughlin namespace ReferenceInitialization {
163412c0af2SDevin Coughlin   struct OtherStruct {
164412c0af2SDevin Coughlin     OtherStruct(int i);
165412c0af2SDevin Coughlin     ~OtherStruct();
166412c0af2SDevin Coughlin   };
167412c0af2SDevin Coughlin 
168412c0af2SDevin Coughlin   struct MyStruct {
169412c0af2SDevin Coughlin     MyStruct(int i);
170412c0af2SDevin Coughlin     MyStruct(OtherStruct os);
171412c0af2SDevin Coughlin 
172412c0af2SDevin Coughlin     void method() const;
173412c0af2SDevin Coughlin   };
174412c0af2SDevin Coughlin 
referenceInitializeLocal()175412c0af2SDevin Coughlin   void referenceInitializeLocal() {
176412c0af2SDevin Coughlin     const MyStruct &myStruct(5);
177412c0af2SDevin Coughlin     myStruct.method(); // no-warning
178412c0af2SDevin Coughlin   }
179412c0af2SDevin Coughlin 
referenceInitializeMultipleLocals()180412c0af2SDevin Coughlin   void referenceInitializeMultipleLocals() {
181412c0af2SDevin Coughlin     const MyStruct &myStruct1(5), myStruct2(5), &myStruct3(5);
182412c0af2SDevin Coughlin     myStruct1.method(); // no-warning
183412c0af2SDevin Coughlin     myStruct2.method(); // no-warning
184412c0af2SDevin Coughlin     myStruct3.method(); // no-warning
185412c0af2SDevin Coughlin   }
186412c0af2SDevin Coughlin 
referenceInitializeLocalWithCleanup()187412c0af2SDevin Coughlin   void referenceInitializeLocalWithCleanup() {
188412c0af2SDevin Coughlin     const MyStruct &myStruct(OtherStruct(5));
189412c0af2SDevin Coughlin     myStruct.method(); // no-warning
190412c0af2SDevin Coughlin   }
191412c0af2SDevin Coughlin };
192c9affb0dSArtem Dergachev 
193c9affb0dSArtem Dergachev namespace PR31592 {
194c9affb0dSArtem Dergachev struct C {
CPR31592::C195c9affb0dSArtem Dergachev    C() : f("}") { } // no-crash
196c9affb0dSArtem Dergachev    const char(&f)[2];
197c9affb0dSArtem Dergachev };
198c9affb0dSArtem Dergachev }
19959428d18SArtem Dergachev 
20059428d18SArtem Dergachev namespace CXX_initializer_lists {
20159428d18SArtem Dergachev struct C {
20259428d18SArtem Dergachev   C(std::initializer_list<int *> list);
20359428d18SArtem Dergachev };
testPointerEscapeIntoLists()204052436f7SArtem Dergachev void testPointerEscapeIntoLists() {
20559428d18SArtem Dergachev   C empty{}; // no-crash
20659428d18SArtem Dergachev 
20759428d18SArtem Dergachev   // Do not warn that 'x' leaks. It might have been deleted by
20859428d18SArtem Dergachev   // the destructor of 'c'.
20959428d18SArtem Dergachev   int *x = new int;
21059428d18SArtem Dergachev   C c{x}; // no-warning
21159428d18SArtem Dergachev }
212052436f7SArtem Dergachev 
testPassListsWithExplicitConstructors()213052436f7SArtem Dergachev void testPassListsWithExplicitConstructors() {
214052436f7SArtem Dergachev   (void)(std::initializer_list<int>){12}; // no-crash
215052436f7SArtem Dergachev }
21659428d18SArtem Dergachev }
217e8ba3ec4SArtem Dergachev 
218e8ba3ec4SArtem Dergachev namespace CXX17_aggregate_construction {
219e8ba3ec4SArtem Dergachev struct A {
220e8ba3ec4SArtem Dergachev   A();
221e8ba3ec4SArtem Dergachev };
222e8ba3ec4SArtem Dergachev 
223e8ba3ec4SArtem Dergachev struct B: public A {
224e8ba3ec4SArtem Dergachev };
225e8ba3ec4SArtem Dergachev 
226e8ba3ec4SArtem Dergachev struct C: public B {
227e8ba3ec4SArtem Dergachev };
228e8ba3ec4SArtem Dergachev 
229e8ba3ec4SArtem Dergachev struct D: public virtual A {
230e8ba3ec4SArtem Dergachev };
231e8ba3ec4SArtem Dergachev 
232e8ba3ec4SArtem Dergachev // In C++17, classes B and C are aggregates, so they will be constructed
233e8ba3ec4SArtem Dergachev // without actually calling their trivial constructor. Used to crash.
foo()234e8ba3ec4SArtem Dergachev void foo() {
235e8ba3ec4SArtem Dergachev   B b = {}; // no-crash
236e8ba3ec4SArtem Dergachev   const B &bl = {}; // no-crash
237e8ba3ec4SArtem Dergachev   B &&br = {}; // no-crash
238e8ba3ec4SArtem Dergachev 
239e8ba3ec4SArtem Dergachev   C c = {}; // no-crash
240e8ba3ec4SArtem Dergachev   const C &cl = {}; // no-crash
241e8ba3ec4SArtem Dergachev   C &&cr = {}; // no-crash
242e8ba3ec4SArtem Dergachev 
243e8ba3ec4SArtem Dergachev   D d = {}; // no-crash
244e8ba3ec4SArtem Dergachev 
245bef9f8aaSArtem Dergachev #if __cplusplus >= 201703L
246e8ba3ec4SArtem Dergachev   C cd = {{}}; // no-crash
247e8ba3ec4SArtem Dergachev   const C &cdl = {{}}; // no-crash
248e8ba3ec4SArtem Dergachev   C &&cdr = {{}}; // no-crash
249e8ba3ec4SArtem Dergachev 
250e8ba3ec4SArtem Dergachev   const B &bll = {{}}; // no-crash
251e8ba3ec4SArtem Dergachev   const B &bcl = C({{}}); // no-crash
252e8ba3ec4SArtem Dergachev   B &&bcr = C({{}}); // no-crash
253e8ba3ec4SArtem Dergachev #endif
254e8ba3ec4SArtem Dergachev }
255aa40315cSArtem Dergachev } // namespace CXX17_aggregate_construction
256aa40315cSArtem Dergachev 
257aa40315cSArtem Dergachev namespace CXX17_transparent_init_list_exprs {
258aa40315cSArtem Dergachev class A {};
259aa40315cSArtem Dergachev 
260aa40315cSArtem Dergachev class B: private A {};
261aa40315cSArtem Dergachev 
262aa40315cSArtem Dergachev B boo();
foo1()263aa40315cSArtem Dergachev void foo1() {
264aa40315cSArtem Dergachev   B b { boo() }; // no-crash
265e8ba3ec4SArtem Dergachev }
266aa40315cSArtem Dergachev 
267aa40315cSArtem Dergachev class C: virtual public A {};
268aa40315cSArtem Dergachev 
269aa40315cSArtem Dergachev C coo();
foo2()270aa40315cSArtem Dergachev void foo2() {
271aa40315cSArtem Dergachev   C c { coo() }; // no-crash
272aa40315cSArtem Dergachev }
273bef9f8aaSArtem Dergachev 
foo_recursive()274bef9f8aaSArtem Dergachev B foo_recursive() {
275bef9f8aaSArtem Dergachev   B b { foo_recursive() };
276bef9f8aaSArtem Dergachev }
277aa40315cSArtem Dergachev } // namespace CXX17_transparent_init_list_exprs
278*192a7474SArtem Dergachev 
279*192a7474SArtem Dergachev namespace skip_vbase_initializer_side_effects {
280*192a7474SArtem Dergachev int glob;
281*192a7474SArtem Dergachev struct S {
Sskip_vbase_initializer_side_effects::S282*192a7474SArtem Dergachev   S() { ++glob; }
283*192a7474SArtem Dergachev };
284*192a7474SArtem Dergachev 
285*192a7474SArtem Dergachev struct A {
Askip_vbase_initializer_side_effects::A286*192a7474SArtem Dergachev   A() {}
Askip_vbase_initializer_side_effects::A287*192a7474SArtem Dergachev   A(S s) {}
288*192a7474SArtem Dergachev };
289*192a7474SArtem Dergachev 
290*192a7474SArtem Dergachev struct B : virtual A {
Bskip_vbase_initializer_side_effects::B291*192a7474SArtem Dergachev   B() : A(S()) {}
292*192a7474SArtem Dergachev };
293*192a7474SArtem Dergachev 
294*192a7474SArtem Dergachev struct C : B {
Cskip_vbase_initializer_side_effects::C295*192a7474SArtem Dergachev   C() {}
296*192a7474SArtem Dergachev };
297*192a7474SArtem Dergachev 
foo()298*192a7474SArtem Dergachev void foo() {
299*192a7474SArtem Dergachev   glob = 0;
300*192a7474SArtem Dergachev   B b;
301*192a7474SArtem Dergachev   clang_analyzer_eval(glob == 1); // expected-warning{{TRUE}}
302*192a7474SArtem Dergachev   C c; // no-crash
303*192a7474SArtem Dergachev   clang_analyzer_eval(glob == 1); // expected-warning{{TRUE}}
304*192a7474SArtem Dergachev }
305*192a7474SArtem Dergachev } // namespace skip_vbase_initializer_side_effects
306*192a7474SArtem Dergachev 
307*192a7474SArtem Dergachev namespace dont_skip_vbase_initializers_in_most_derived_class {
308*192a7474SArtem Dergachev struct A {
309*192a7474SArtem Dergachev   static int a;
Adont_skip_vbase_initializers_in_most_derived_class::A310*192a7474SArtem Dergachev   A() { a = 0; }
Adont_skip_vbase_initializers_in_most_derived_class::A311*192a7474SArtem Dergachev   A(int x) { a = x; }
312*192a7474SArtem Dergachev };
313*192a7474SArtem Dergachev 
314*192a7474SArtem Dergachev struct B {
315*192a7474SArtem Dergachev   static int b;
Bdont_skip_vbase_initializers_in_most_derived_class::B316*192a7474SArtem Dergachev   B() { b = 0; }
Bdont_skip_vbase_initializers_in_most_derived_class::B317*192a7474SArtem Dergachev   B(int y) { b = y; }
318*192a7474SArtem Dergachev };
319*192a7474SArtem Dergachev 
320*192a7474SArtem Dergachev struct C : virtual A {
Cdont_skip_vbase_initializers_in_most_derived_class::C321*192a7474SArtem Dergachev   C() : A(1) {}
322*192a7474SArtem Dergachev };
323*192a7474SArtem Dergachev struct D : C, virtual B {
Ddont_skip_vbase_initializers_in_most_derived_class::D324*192a7474SArtem Dergachev   D() : B(2) {}
325*192a7474SArtem Dergachev };
326*192a7474SArtem Dergachev 
testD()327*192a7474SArtem Dergachev void testD() {
328*192a7474SArtem Dergachev   D d;
329*192a7474SArtem Dergachev   clang_analyzer_eval(A::a == 0); // expected-warning{{TRUE}}
330*192a7474SArtem Dergachev   clang_analyzer_eval(B::b == 2); // expected-warning{{TRUE}}
331*192a7474SArtem Dergachev }
332*192a7474SArtem Dergachev 
333*192a7474SArtem Dergachev struct E : virtual B, C {
Edont_skip_vbase_initializers_in_most_derived_class::E334*192a7474SArtem Dergachev   E() : B(2) {}
335*192a7474SArtem Dergachev };
336*192a7474SArtem Dergachev 
testE()337*192a7474SArtem Dergachev void testE() {
338*192a7474SArtem Dergachev   E e;
339*192a7474SArtem Dergachev   clang_analyzer_eval(A::a == 0); // expected-warning{{TRUE}}
340*192a7474SArtem Dergachev   clang_analyzer_eval(B::b == 2); // expected-warning{{TRUE}}
341*192a7474SArtem Dergachev }
342*192a7474SArtem Dergachev 
343*192a7474SArtem Dergachev struct F : virtual A, virtual B {
Fdont_skip_vbase_initializers_in_most_derived_class::F344*192a7474SArtem Dergachev   F() : A(1) {}
345*192a7474SArtem Dergachev };
346*192a7474SArtem Dergachev struct G : F {
Gdont_skip_vbase_initializers_in_most_derived_class::G347*192a7474SArtem Dergachev   G(): B(2) {}
348*192a7474SArtem Dergachev };
349*192a7474SArtem Dergachev 
testG()350*192a7474SArtem Dergachev void testG() {
351*192a7474SArtem Dergachev   G g;
352*192a7474SArtem Dergachev   clang_analyzer_eval(A::a == 0); // expected-warning{{TRUE}}
353*192a7474SArtem Dergachev   clang_analyzer_eval(B::b == 2); // expected-warning{{TRUE}}
354*192a7474SArtem Dergachev }
355*192a7474SArtem Dergachev 
356*192a7474SArtem Dergachev struct H : virtual B, virtual A {
Hdont_skip_vbase_initializers_in_most_derived_class::H357*192a7474SArtem Dergachev   H(): A(1) {}
358*192a7474SArtem Dergachev };
359*192a7474SArtem Dergachev struct I : H {
Idont_skip_vbase_initializers_in_most_derived_class::I360*192a7474SArtem Dergachev   I(): B(2) {}
361*192a7474SArtem Dergachev };
362*192a7474SArtem Dergachev 
testI()363*192a7474SArtem Dergachev void testI() {
364*192a7474SArtem Dergachev   I i;
365*192a7474SArtem Dergachev   clang_analyzer_eval(A::a == 0); // expected-warning{{TRUE}}
366*192a7474SArtem Dergachev   clang_analyzer_eval(B::b == 2); // expected-warning{{TRUE}}
367*192a7474SArtem Dergachev }
368*192a7474SArtem Dergachev } // namespace dont_skip_vbase_initializers_in_most_derived_class
369