1 // RUN: %clang_analyze_cc1 -w -analyzer-checker=debug.DumpLiveStmts %s 2>&1\
2 // RUN:   | FileCheck %s
3 
4 int coin();
5 
6 
7 int testThatDumperWorks(int x, int y, int z) {
8   return x ? y : z;
9 }
10 // CHECK: [ B0 (live statements at block exit) ]
11 // CHECK-EMPTY:
12 // CHECK-EMPTY:
13 // CHECK: [ B1 (live statements at block exit) ]
14 // CHECK-EMPTY:
15 // CHECK-EMPTY:
16 // CHECK: [ B2 (live statements at block exit) ]
17 // CHECK-EMPTY:
18 // CHECK-NEXT: DeclRefExpr {{.*}} 'y' 'int'
19 // CHECK-EMPTY:
20 // CHECK-NEXT: DeclRefExpr {{.*}} 'z' 'int'
21 // CHECK-EMPTY:
22 // CHECK-NEXT: ImplicitCastExpr {{.*}} <IntegralToBoolean>
23 // CHECK-NEXT: `-ImplicitCastExpr {{.*}} <LValueToRValue>
24 // CHECK-NEXT:   `-DeclRefExpr {{.*}} 'x' 'int'
25 // CHECK-EMPTY:
26 // CHECK-EMPTY:
27 // CHECK: [ B3 (live statements at block exit) ]
28 // CHECK-EMPTY:
29 // CHECK-NEXT: DeclRefExpr {{.*}} 'y' 'int'
30 // CHECK-EMPTY:
31 // CHECK-NEXT: DeclRefExpr {{.*}} 'z' 'int'
32 // CHECK-EMPTY:
33 // CHECK-NEXT: ImplicitCastExpr {{.*}} <IntegralToBoolean>
34 // CHECK-NEXT: `-ImplicitCastExpr {{.*}} <LValueToRValue>
35 // CHECK-NEXT:   `-DeclRefExpr {{.*}} 'x' 'int'
36 // CHECK: [ B4 (live statements at block exit) ]
37 // CHECK-EMPTY:
38 // CHECK-NEXT: DeclRefExpr {{.*}} 'y' 'int'
39 // CHECK-EMPTY:
40 // CHECK-NEXT: DeclRefExpr {{.*}} 'z' 'int'
41 // CHECK-EMPTY:
42 // CHECK-NEXT: ImplicitCastExpr {{.*}} <IntegralToBoolean>
43 // CHECK-NEXT: `-ImplicitCastExpr {{.*}} <LValueToRValue>
44 // CHECK-NEXT:   `-DeclRefExpr {{.*}} 'x' 'int'
45 // CHECK-EMPTY:
46 // CHECK-EMPTY:
47 // CHECK: [ B5 (live statements at block exit) ]
48 // CHECK-EMPTY:
49 // CHECK-NEXT: DeclRefExpr {{.*}} 'y' 'int'
50 // CHECK-EMPTY:
51 // CHECK-NEXT: DeclRefExpr {{.*}} 'z' 'int'
52 // CHECK-EMPTY:
53 // CHECK-EMPTY:
54 
55 
56 void testIfBranchExpression(bool flag) {
57   // No expressions should be carried over from one block to another here.
58   while (flag) {
59     int e = 1;
60     if (true)
61       e;
62   }
63 }
64 // CHECK: [ B0 (live statements at block exit) ]
65 // CHECK-EMPTY:
66 // CHECK-EMPTY:
67 // CHECK: [ B1 (live statements at block exit) ]
68 // CHECK-EMPTY:
69 // CHECK-EMPTY:
70 // CHECK: [ B2 (live statements at block exit) ]
71 // CHECK-EMPTY:
72 // CHECK-EMPTY:
73 // CHECK: [ B3 (live statements at block exit) ]
74 // CHECK-EMPTY:
75 // CHECK-EMPTY:
76 // CHECK: [ B4 (live statements at block exit) ]
77 // CHECK-EMPTY:
78 // CHECK-EMPTY:
79 // CHECK: [ B5 (live statements at block exit) ]
80 // CHECK-EMPTY:
81 // CHECK-EMPTY:
82 
83 
84 void testWhileBodyExpression(bool flag) {
85   // No expressions should be carried over from one block to another here.
86   while (flag) {
87     int e = 1;
88     while (coin())
89       e;
90   }
91 }
92 // CHECK: [ B0 (live statements at block exit) ]
93 // CHECK-EMPTY:
94 // CHECK-EMPTY:
95 // CHECK: [ B1 (live statements at block exit) ]
96 // CHECK-EMPTY:
97 // CHECK-EMPTY:
98 // CHECK: [ B2 (live statements at block exit) ]
99 // CHECK-EMPTY:
100 // CHECK-EMPTY:
101 // CHECK: [ B3 (live statements at block exit) ]
102 // CHECK-EMPTY:
103 // CHECK-EMPTY:
104 // CHECK: [ B4 (live statements at block exit) ]
105 // CHECK-EMPTY:
106 // CHECK-EMPTY:
107 // CHECK: [ B5 (live statements at block exit) ]
108 // CHECK-EMPTY:
109 // CHECK-EMPTY:
110 
111 
112 void testDoWhileBodyExpression(bool flag) {
113   // No expressions should be carried over from one block to another here.
114   while (flag) {
115     int e = 1;
116     do
117       e;
118     while (coin());
119   }
120 }
121 // CHECK: [ B0 (live statements at block exit) ]
122 // CHECK-EMPTY:
123 // CHECK-EMPTY:
124 // CHECK: [ B1 (live statements at block exit) ]
125 // CHECK-EMPTY:
126 // CHECK-EMPTY:
127 // CHECK: [ B2 (live statements at block exit) ]
128 // CHECK-EMPTY:
129 // CHECK-EMPTY:
130 // CHECK: [ B3 (live statements at block exit) ]
131 // CHECK-EMPTY:
132 // CHECK-EMPTY:
133 // CHECK: [ B4 (live statements at block exit) ]
134 // CHECK-EMPTY:
135 // CHECK-EMPTY:
136 // CHECK: [ B5 (live statements at block exit) ]
137 // CHECK-EMPTY:
138 // CHECK-EMPTY:
139 
140 
141 void testForBodyExpression(bool flag) {
142   // No expressions should be carried over from one block to another here.
143   while (flag) {
144     int e = 1;
145     for (; coin();)
146       e;
147   }
148 }
149 // CHECK: [ B0 (live statements at block exit) ]
150 // CHECK-EMPTY:
151 // CHECK-EMPTY:
152 // CHECK: [ B1 (live statements at block exit) ]
153 // CHECK-EMPTY:
154 // CHECK-EMPTY:
155 // CHECK: [ B2 (live statements at block exit) ]
156 // CHECK-EMPTY:
157 // CHECK-EMPTY:
158 // CHECK: [ B3 (live statements at block exit) ]
159 // CHECK-EMPTY:
160 // CHECK-EMPTY:
161 // CHECK: [ B4 (live statements at block exit) ]
162 // CHECK-EMPTY:
163 // CHECK-EMPTY:
164 // CHECK: [ B5 (live statements at block exit) ]
165 // CHECK-EMPTY:
166 // CHECK-EMPTY:
167 
168