15e0fb648SArtem Dergachev // RUN: %clang_cc1 -fsyntax-only -analyze \
25e0fb648SArtem Dergachev // RUN:   -analyzer-checker=core,debug.ExprInspection %s -verify
35e0fb648SArtem Dergachev 
45e0fb648SArtem Dergachev // These test cases demonstrate lack of Static Analyzer features.
55e0fb648SArtem Dergachev // The FIXME: tags indicate where we expect different output.
65e0fb648SArtem Dergachev 
75e0fb648SArtem Dergachev // Handle constructors within new[].
85e0fb648SArtem Dergachev 
95e0fb648SArtem Dergachev // When an array of objects is allocated using the operator new[],
105e0fb648SArtem Dergachev // constructors for all elements of the array are called.
115e0fb648SArtem Dergachev // We should model (potentially some of) such evaluations,
125e0fb648SArtem Dergachev // and the same applies for destructors called from operator delete[].
135e0fb648SArtem Dergachev 
145e0fb648SArtem Dergachev void clang_analyzer_eval(bool);
155e0fb648SArtem Dergachev 
165e0fb648SArtem Dergachev struct init_with_list {
175e0fb648SArtem Dergachev   int a;
init_with_listinit_with_list185e0fb648SArtem Dergachev   init_with_list() : a(1) {}
195e0fb648SArtem Dergachev };
205e0fb648SArtem Dergachev 
215e0fb648SArtem Dergachev struct init_in_body {
225e0fb648SArtem Dergachev   int a;
init_in_bodyinit_in_body235e0fb648SArtem Dergachev   init_in_body() { a = 1; }
245e0fb648SArtem Dergachev };
255e0fb648SArtem Dergachev 
265e0fb648SArtem Dergachev struct init_default_member {
275e0fb648SArtem Dergachev   int a = 1;
285e0fb648SArtem Dergachev };
295e0fb648SArtem Dergachev 
test_automatic()305e0fb648SArtem Dergachev void test_automatic() {
315e0fb648SArtem Dergachev 
325e0fb648SArtem Dergachev   init_with_list a1;
335e0fb648SArtem Dergachev   init_in_body a2;
345e0fb648SArtem Dergachev   init_default_member a3;
355e0fb648SArtem Dergachev 
365e0fb648SArtem Dergachev   clang_analyzer_eval(a1.a == 1); // expected-warning {{TRUE}}
375e0fb648SArtem Dergachev   clang_analyzer_eval(a2.a == 1); // expected-warning {{TRUE}}
385e0fb648SArtem Dergachev   clang_analyzer_eval(a3.a == 1); // expected-warning {{TRUE}}
395e0fb648SArtem Dergachev }
405e0fb648SArtem Dergachev 
test_dynamic()415e0fb648SArtem Dergachev void test_dynamic() {
425e0fb648SArtem Dergachev 
435e0fb648SArtem Dergachev   auto *a1 = new init_with_list;
445e0fb648SArtem Dergachev   auto *a2 = new init_in_body;
455e0fb648SArtem Dergachev   auto *a3 = new init_default_member;
465e0fb648SArtem Dergachev 
475e0fb648SArtem Dergachev   clang_analyzer_eval(a1->a == 1); // expected-warning {{TRUE}}
485e0fb648SArtem Dergachev   clang_analyzer_eval(a2->a == 1); // expected-warning {{TRUE}}
495e0fb648SArtem Dergachev   clang_analyzer_eval(a3->a == 1); // expected-warning {{TRUE}}
505e0fb648SArtem Dergachev 
515e0fb648SArtem Dergachev   delete a1;
525e0fb648SArtem Dergachev   delete a2;
535e0fb648SArtem Dergachev   delete a3;
545e0fb648SArtem Dergachev }
555e0fb648SArtem Dergachev 
test_automatic_aggregate()565e0fb648SArtem Dergachev void test_automatic_aggregate() {
575e0fb648SArtem Dergachev 
585e0fb648SArtem Dergachev   init_with_list a1[1];
595e0fb648SArtem Dergachev   init_in_body a2[1];
605e0fb648SArtem Dergachev   init_default_member a3[1];
615e0fb648SArtem Dergachev 
62*b032e3ffSisuckatcs   clang_analyzer_eval(a1[0].a == 1); // expected-warning {{TRUE}}
63*b032e3ffSisuckatcs   clang_analyzer_eval(a2[0].a == 1); // expected-warning {{TRUE}}
64*b032e3ffSisuckatcs   clang_analyzer_eval(a3[0].a == 1); // expected-warning {{TRUE}}
655e0fb648SArtem Dergachev }
665e0fb648SArtem Dergachev 
test_dynamic_aggregate()675e0fb648SArtem Dergachev void test_dynamic_aggregate() {
685e0fb648SArtem Dergachev 
695e0fb648SArtem Dergachev   auto *a1 = new init_with_list[1];
705e0fb648SArtem Dergachev   auto *a2 = new init_in_body[1];
715e0fb648SArtem Dergachev   auto *a3 = new init_default_member[1];
725e0fb648SArtem Dergachev 
73*b032e3ffSisuckatcs   clang_analyzer_eval(a1[0].a == 1); // expected-warning {{TRUE}}
74*b032e3ffSisuckatcs   clang_analyzer_eval(a2[0].a == 1); // expected-warning {{TRUE}}
75*b032e3ffSisuckatcs   clang_analyzer_eval(a3[0].a == 1); // expected-warning {{TRUE}}
765e0fb648SArtem Dergachev 
775e0fb648SArtem Dergachev   delete[] a1;
785e0fb648SArtem Dergachev   delete[] a2;
795e0fb648SArtem Dergachev   delete[] a3;
805e0fb648SArtem Dergachev }
81