1 // RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -std=c++17 -verify %s
2
3 void clang_analyzer_eval(bool);
4
5 struct s {
6 int a;
7 int b;
8 };
9
a(void)10 void a(void) {
11 s tst;
12
13 auto [i, j] = tst;
14
15 int x = i; // expected-warning{{Assigned value is garbage or undefined}}
16 }
17
b(void)18 void 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 garbage or undefined}}
26 }
27
c(void)28 void c(void) {
29 s tst;
30
31 auto &[i, j] = tst;
32
33 int x = i; // expected-warning{{Assigned value is garbage or undefined}}
34 }
35
d(void)36 void 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 garbage or undefined}}
47 }
48
e(void)49 void 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
f(void)61 void f(void) {
62 s tst;
63
64 auto &&[i, j] = tst;
65
66 int x = i; // expected-warning{{Assigned value is garbage or undefined}}
67 }
68
g(void)69 void 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 garbage or undefined}}
77 }
78
79 struct s2 {
80 int a = 1;
81 int b = 2;
82 };
83
84 struct s3 {
85 s x;
86 s2 y;
87 };
88
h(void)89 void 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 fix
97 // 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
i(void)105 void 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