1*8ef62808Sisuckatcs // RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -std=c++17 -verify %s 2*8ef62808Sisuckatcs 3*8ef62808Sisuckatcs void clang_analyzer_eval(bool); 4*8ef62808Sisuckatcs 5*8ef62808Sisuckatcs void array_init() { 6*8ef62808Sisuckatcs int arr[] = {1, 2, 3, 4, 5}; 7*8ef62808Sisuckatcs 8*8ef62808Sisuckatcs auto [a, b, c, d, e] = arr; 9*8ef62808Sisuckatcs 10*8ef62808Sisuckatcs clang_analyzer_eval(a == 1); // expected-warning{{TRUE}} 11*8ef62808Sisuckatcs clang_analyzer_eval(b == 2); // expected-warning{{TRUE}} 12*8ef62808Sisuckatcs clang_analyzer_eval(c == 3); // expected-warning{{TRUE}} 13*8ef62808Sisuckatcs clang_analyzer_eval(d == 4); // expected-warning{{TRUE}} 14*8ef62808Sisuckatcs clang_analyzer_eval(e == 5); // expected-warning{{TRUE}} 15*8ef62808Sisuckatcs } 16*8ef62808Sisuckatcs 17*8ef62808Sisuckatcs void array_uninit() { 18*8ef62808Sisuckatcs int arr[5]; 19*8ef62808Sisuckatcs 20*8ef62808Sisuckatcs auto [a, b, c, d, e] = arr; 21*8ef62808Sisuckatcs 22*8ef62808Sisuckatcs int x = e; // expected-warning{{Assigned value is garbage or undefined}} 23*8ef62808Sisuckatcs } 24*8ef62808Sisuckatcs 25*8ef62808Sisuckatcs void lambda_init() { 26*8ef62808Sisuckatcs int arr[] = {1, 2, 3, 4, 5}; 27*8ef62808Sisuckatcs 28*8ef62808Sisuckatcs auto l = [arr] { return arr[0]; }(); 29*8ef62808Sisuckatcs clang_analyzer_eval(l == 1); // expected-warning{{TRUE}} 30*8ef62808Sisuckatcs 31*8ef62808Sisuckatcs l = [arr] { return arr[1]; }(); 32*8ef62808Sisuckatcs clang_analyzer_eval(l == 2); // expected-warning{{TRUE}} 33*8ef62808Sisuckatcs 34*8ef62808Sisuckatcs l = [arr] { return arr[2]; }(); 35*8ef62808Sisuckatcs clang_analyzer_eval(l == 3); // expected-warning{{TRUE}} 36*8ef62808Sisuckatcs 37*8ef62808Sisuckatcs l = [arr] { return arr[3]; }(); 38*8ef62808Sisuckatcs clang_analyzer_eval(l == 4); // expected-warning{{TRUE}} 39*8ef62808Sisuckatcs 40*8ef62808Sisuckatcs l = [arr] { return arr[4]; }(); 41*8ef62808Sisuckatcs clang_analyzer_eval(l == 5); // expected-warning{{TRUE}} 42*8ef62808Sisuckatcs } 43*8ef62808Sisuckatcs 44*8ef62808Sisuckatcs void lambda_uninit() { 45*8ef62808Sisuckatcs int arr[5]; 46*8ef62808Sisuckatcs 47*8ef62808Sisuckatcs // FIXME: These should be Undefined, but we fail to read Undefined from a lazyCompoundVal 48*8ef62808Sisuckatcs int l = [arr] { return arr[0]; }(); 49*8ef62808Sisuckatcs clang_analyzer_eval(l); // expected-warning{{UNKNOWN}} 50*8ef62808Sisuckatcs 51*8ef62808Sisuckatcs l = [arr] { return arr[1]; }(); 52*8ef62808Sisuckatcs clang_analyzer_eval(l); // expected-warning{{UNKNOWN}} 53*8ef62808Sisuckatcs 54*8ef62808Sisuckatcs l = [arr] { return arr[2]; }(); 55*8ef62808Sisuckatcs clang_analyzer_eval(l); // expected-warning{{UNKNOWN}} 56*8ef62808Sisuckatcs 57*8ef62808Sisuckatcs l = [arr] { return arr[3]; }(); 58*8ef62808Sisuckatcs clang_analyzer_eval(l); // expected-warning{{UNKNOWN}} 59*8ef62808Sisuckatcs 60*8ef62808Sisuckatcs l = [arr] { return arr[4]; }(); 61*8ef62808Sisuckatcs clang_analyzer_eval(l); // expected-warning{{UNKNOWN}} 62*8ef62808Sisuckatcs } 63*8ef62808Sisuckatcs 64*8ef62808Sisuckatcs struct S { 65*8ef62808Sisuckatcs int arr[5]; 66*8ef62808Sisuckatcs }; 67*8ef62808Sisuckatcs 68*8ef62808Sisuckatcs void copy_ctor_init() { 69*8ef62808Sisuckatcs S orig; 70*8ef62808Sisuckatcs orig.arr[0] = 1; 71*8ef62808Sisuckatcs orig.arr[1] = 2; 72*8ef62808Sisuckatcs orig.arr[2] = 3; 73*8ef62808Sisuckatcs orig.arr[3] = 4; 74*8ef62808Sisuckatcs orig.arr[4] = 5; 75*8ef62808Sisuckatcs 76*8ef62808Sisuckatcs S copy = orig; 77*8ef62808Sisuckatcs clang_analyzer_eval(copy.arr[0] == 1); // expected-warning{{TRUE}} 78*8ef62808Sisuckatcs clang_analyzer_eval(copy.arr[1] == 2); // expected-warning{{TRUE}} 79*8ef62808Sisuckatcs clang_analyzer_eval(copy.arr[2] == 3); // expected-warning{{TRUE}} 80*8ef62808Sisuckatcs clang_analyzer_eval(copy.arr[3] == 4); // expected-warning{{TRUE}} 81*8ef62808Sisuckatcs clang_analyzer_eval(copy.arr[4] == 5); // expected-warning{{TRUE}} 82*8ef62808Sisuckatcs } 83*8ef62808Sisuckatcs 84*8ef62808Sisuckatcs void copy_ctor_uninit() { 85*8ef62808Sisuckatcs S orig; 86*8ef62808Sisuckatcs 87*8ef62808Sisuckatcs S copy = orig; 88*8ef62808Sisuckatcs 89*8ef62808Sisuckatcs // FIXME: These should be Undefined, but we fail to read Undefined from a lazyCompoundVal. 90*8ef62808Sisuckatcs // If the struct is not considered a small struct, instead of a copy, we store a lazy compound value. 91*8ef62808Sisuckatcs // As the struct has an array data member, it is not considered small. 92*8ef62808Sisuckatcs clang_analyzer_eval(copy.arr[0]); // expected-warning{{UNKNOWN}} 93*8ef62808Sisuckatcs clang_analyzer_eval(copy.arr[1]); // expected-warning{{UNKNOWN}} 94*8ef62808Sisuckatcs clang_analyzer_eval(copy.arr[2]); // expected-warning{{UNKNOWN}} 95*8ef62808Sisuckatcs clang_analyzer_eval(copy.arr[3]); // expected-warning{{UNKNOWN}} 96*8ef62808Sisuckatcs clang_analyzer_eval(copy.arr[4]); // expected-warning{{UNKNOWN}} 97*8ef62808Sisuckatcs } 98*8ef62808Sisuckatcs 99*8ef62808Sisuckatcs void move_ctor_init() { 100*8ef62808Sisuckatcs S orig; 101*8ef62808Sisuckatcs orig.arr[0] = 1; 102*8ef62808Sisuckatcs orig.arr[1] = 2; 103*8ef62808Sisuckatcs orig.arr[2] = 3; 104*8ef62808Sisuckatcs orig.arr[3] = 4; 105*8ef62808Sisuckatcs orig.arr[4] = 5; 106*8ef62808Sisuckatcs 107*8ef62808Sisuckatcs S moved = (S &&) orig; 108*8ef62808Sisuckatcs 109*8ef62808Sisuckatcs clang_analyzer_eval(moved.arr[0] == 1); // expected-warning{{TRUE}} 110*8ef62808Sisuckatcs clang_analyzer_eval(moved.arr[1] == 2); // expected-warning{{TRUE}} 111*8ef62808Sisuckatcs clang_analyzer_eval(moved.arr[2] == 3); // expected-warning{{TRUE}} 112*8ef62808Sisuckatcs clang_analyzer_eval(moved.arr[3] == 4); // expected-warning{{TRUE}} 113*8ef62808Sisuckatcs clang_analyzer_eval(moved.arr[4] == 5); // expected-warning{{TRUE}} 114*8ef62808Sisuckatcs } 115*8ef62808Sisuckatcs 116*8ef62808Sisuckatcs void move_ctor_uninit() { 117*8ef62808Sisuckatcs S orig; 118*8ef62808Sisuckatcs 119*8ef62808Sisuckatcs S moved = (S &&) orig; 120*8ef62808Sisuckatcs 121*8ef62808Sisuckatcs // FIXME: These should be Undefined, but we fail to read Undefined from a lazyCompoundVal. 122*8ef62808Sisuckatcs clang_analyzer_eval(moved.arr[0]); // expected-warning{{UNKNOWN}} 123*8ef62808Sisuckatcs clang_analyzer_eval(moved.arr[1]); // expected-warning{{UNKNOWN}} 124*8ef62808Sisuckatcs clang_analyzer_eval(moved.arr[2]); // expected-warning{{UNKNOWN}} 125*8ef62808Sisuckatcs clang_analyzer_eval(moved.arr[3]); // expected-warning{{UNKNOWN}} 126*8ef62808Sisuckatcs clang_analyzer_eval(moved.arr[4]); // expected-warning{{UNKNOWN}} 127*8ef62808Sisuckatcs } 128