117 lines · cpp
1// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -std=c++17 -verify %s2 3void clang_analyzer_eval(bool);4 5struct s {6 int a;7 int b;8};9 10void a(void) {11 s tst;12 13 auto [i, j] = tst;14 15 int x = i; // expected-warning{{Assigned value is uninitialized}}16}17 18void b(void) {19 s tst;20 tst.a = 1;21 22 auto [i, j] = tst;23 24 clang_analyzer_eval(i == 1); // expected-warning{{TRUE}}25 int y = j; // expected-warning{{Assigned value is uninitialized}}26}27 28void c(void) {29 s tst;30 31 auto &[i, j] = tst;32 33 int x = i; // expected-warning{{Assigned value is uninitialized}}34}35 36void d(void) {37 s tst;38 tst.a = 1;39 40 auto &[i, j] = tst;41 42 clang_analyzer_eval(i == 1); // expected-warning{{TRUE}}43 i = 2;44 clang_analyzer_eval(tst.a == 2); // expected-warning{{TRUE}}45 46 int y = j; // expected-warning{{Assigned value is uninitialized}}47}48 49void e(void) {50 s tst;51 tst.a = 1;52 53 auto &[i, j] = tst;54 55 clang_analyzer_eval(i == 1); // expected-warning{{TRUE}}56 57 tst.b = 2;58 clang_analyzer_eval(j == 2); // expected-warning{{TRUE}}59}60 61void f(void) {62 s tst;63 64 auto &&[i, j] = tst;65 66 int x = i; // expected-warning{{Assigned value is uninitialized}}67}68 69void g(void) {70 s tst;71 tst.a = 1;72 73 auto &&[i, j] = tst;74 75 clang_analyzer_eval(i == 1); // expected-warning{{TRUE}}76 int y = j; // expected-warning{{Assigned value is uninitialized}}77}78 79struct s2 {80 int a = 1;81 int b = 2;82};83 84struct s3 {85 s x;86 s2 y;87};88 89void h(void) {90 s3 tst;91 92 clang_analyzer_eval(tst.y.a == 1); // expected-warning{{TRUE}}93 94 auto [i, j] = tst;95 96 // FIXME: These should be undefined, but we have to fix97 // reading undefined from lazy compound values first.98 clang_analyzer_eval(i.a); // expected-warning{{UNKNOWN}}99 clang_analyzer_eval(i.b); // expected-warning{{UNKNOWN}}100 101 clang_analyzer_eval(j.a == 1); // expected-warning{{TRUE}}102 clang_analyzer_eval(j.b == 2); // expected-warning{{TRUE}}103}104 105void i(void) {106 s3 tst;107 108 clang_analyzer_eval(tst.y.a == 1); // expected-warning{{TRUE}}109 110 auto &[i, j] = tst;111 j.a = 3;112 113 clang_analyzer_eval(tst.y.a == 3); // expected-warning{{TRUE}}114 clang_analyzer_eval(tst.y.b == 2); // expected-warning{{TRUE}}115 clang_analyzer_eval(j.b == 2); // expected-warning{{TRUE}}116}117