Clang Project

clang_source_code/test/Analysis/live-stmts.cpp
1// RUN: %clang_analyze_cc1 -w -analyzer-checker=debug.DumpLiveStmts %s 2>&1\
2// RUN:   | FileCheck %s
3
4int coin();
5
6
7int 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
56void 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
84void 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
112void 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
141void 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