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 Dergachevvoid 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 Dergachevvoid 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 Dergachevvoid 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 Dergachevvoid 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