xref: /llvm-project/clang/test/Analysis/uninit-structured-binding-struct.cpp (revision e77ac66b8c1cf4f09f931d37749ed258f122d708)
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