1 // RUN: %clang_cc1 -fsyntax-only -analyze \ 2 // RUN: -analyzer-checker=core,debug.ExprInspection %s -verify 3 4 // These test cases demonstrate lack of Static Analyzer features. 5 // The FIXME: tags indicate where we expect different output. 6 7 // Handle constructors within new[]. 8 9 // When an array of objects is allocated using the operator new[], 10 // constructors for all elements of the array are called. 11 // We should model (potentially some of) such evaluations, 12 // and the same applies for destructors called from operator delete[]. 13 14 void clang_analyzer_eval(bool); 15 16 struct init_with_list { 17 int a; init_with_listinit_with_list18 init_with_list() : a(1) {} 19 }; 20 21 struct init_in_body { 22 int a; init_in_bodyinit_in_body23 init_in_body() { a = 1; } 24 }; 25 26 struct init_default_member { 27 int a = 1; 28 }; 29 test_automatic()30void test_automatic() { 31 32 init_with_list a1; 33 init_in_body a2; 34 init_default_member a3; 35 36 clang_analyzer_eval(a1.a == 1); // expected-warning {{TRUE}} 37 clang_analyzer_eval(a2.a == 1); // expected-warning {{TRUE}} 38 clang_analyzer_eval(a3.a == 1); // expected-warning {{TRUE}} 39 } 40 test_dynamic()41void test_dynamic() { 42 43 auto *a1 = new init_with_list; 44 auto *a2 = new init_in_body; 45 auto *a3 = new init_default_member; 46 47 clang_analyzer_eval(a1->a == 1); // expected-warning {{TRUE}} 48 clang_analyzer_eval(a2->a == 1); // expected-warning {{TRUE}} 49 clang_analyzer_eval(a3->a == 1); // expected-warning {{TRUE}} 50 51 delete a1; 52 delete a2; 53 delete a3; 54 } 55 test_automatic_aggregate()56void test_automatic_aggregate() { 57 58 init_with_list a1[1]; 59 init_in_body a2[1]; 60 init_default_member a3[1]; 61 62 // FIXME: Should be TRUE, not FALSE. 63 clang_analyzer_eval(a1[0].a == 1); // expected-warning {{TRUE}} expected-warning {{FALSE}} 64 // FIXME: Should be TRUE, not FALSE. 65 clang_analyzer_eval(a2[0].a == 1); // expected-warning {{TRUE}} expected-warning {{FALSE}} 66 // FIXME: Should be TRUE, not FALSE. 67 clang_analyzer_eval(a3[0].a == 1); // expected-warning {{TRUE}} expected-warning {{FALSE}} 68 } 69 test_dynamic_aggregate()70void test_dynamic_aggregate() { 71 72 auto *a1 = new init_with_list[1]; 73 auto *a2 = new init_in_body[1]; 74 auto *a3 = new init_default_member[1]; 75 76 // FIXME: Should be TRUE, not FALSE. 77 clang_analyzer_eval(a1[0].a == 1); // expected-warning {{TRUE}} expected-warning {{FALSE}} 78 // FIXME: Should be TRUE, not FALSE. 79 clang_analyzer_eval(a2[0].a == 1); // expected-warning {{TRUE}} expected-warning {{FALSE}} 80 // FIXME: Should be TRUE, not FALSE. 81 clang_analyzer_eval(a3[0].a == 1); // expected-warning {{TRUE}} expected-warning {{FALSE}} 82 83 delete[] a1; 84 delete[] a2; 85 delete[] a3; 86 } 87