brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.2 KiB · 19bc7b2 Raw
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