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 | |