1 // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -analyze -analyzer-checker=debug.DumpCFG %s > %t 2>&1
2 // RUN: FileCheck --input-file=%t %s
3 // XPASS: *
4
5 class A {
6 public:
A()7 A() {}
~A()8 ~A() {}
operator int() const9 operator int() const { return 1; }
10 };
11
12 extern const bool UV;
13
test_const_ref()14 void test_const_ref() {
15 A a;
16 const A& b = a;
17 const A& c = A();
18 }
19
test_array()20 void test_array() {
21 A a[2];
22 A b[0];
23 }
24
test_scope()25 void test_scope() {
26 A a;
27 { A c;
28 A d;
29 }
30 A b;
31 }
32
test_return()33 void test_return() {
34 A a;
35 A b;
36 if (UV) return;
37 A c;
38 }
39
test_goto()40 void test_goto() {
41 A a;
42 l0:
43 A b;
44 { A a;
45 if (UV) goto l0;
46 if (UV) goto l1;
47 A b;
48 }
49 l1:
50 A c;
51 }
52
test_if_implicit_scope()53 void test_if_implicit_scope() {
54 A a;
55 if (A b = a)
56 A c;
57 else A c;
58 }
59
test_if_jumps()60 void test_if_jumps() {
61 A a;
62 if (A b = a) {
63 A c;
64 if (UV) return;
65 A d;
66 } else {
67 A c;
68 if (UV) return;
69 A d;
70 }
71 A e;
72 }
73
test_while_implicit_scope()74 void test_while_implicit_scope() {
75 A a;
76 while (A b = a)
77 A c;
78 }
79
test_while_jumps()80 void test_while_jumps() {
81 A a;
82 while (A b = a) {
83 A c;
84 if (UV) break;
85 if (UV) continue;
86 if (UV) return;
87 A d;
88 }
89 A e;
90 }
91
test_do_implicit_scope()92 void test_do_implicit_scope() {
93 do A a;
94 while (UV);
95 }
96
test_do_jumps()97 void test_do_jumps() {
98 A a;
99 do {
100 A b;
101 if (UV) break;
102 if (UV) continue;
103 if (UV) return;
104 A c;
105 } while (UV);
106 A d;
107 }
108
test_switch_implicit_scope()109 void test_switch_implicit_scope() {
110 A a;
111 switch (A b = a)
112 A c;
113 }
114
test_switch_jumps()115 void test_switch_jumps() {
116 A a;
117 switch (A b = a) {
118 case 0: {
119 A c;
120 if (UV) break;
121 if (UV) return;
122 A f;
123 }
124 case 1:
125 break;
126 }
127 A g;
128 }
129
test_for_implicit_scope()130 void test_for_implicit_scope() {
131 for (A a; A b = a; )
132 A c;
133 }
134
test_for_jumps()135 void test_for_jumps() {
136 A a;
137 for (A b; A c = b; ) {
138 A d;
139 if (UV) break;
140 if (UV) continue;
141 if (UV) return;
142 A e;
143 }
144 A f;
145 }
146
test_catch_const_ref()147 void test_catch_const_ref() {
148 try {
149 } catch (const A& e) {
150 }
151 }
152
test_catch_copy()153 void test_catch_copy() {
154 try {
155 } catch (A e) {
156 }
157 }
158
159 // CHECK: [B1 (ENTRY)]
160 // CHECK: Succs (1): B0
161 // CHECK: [B0 (EXIT)]
162 // CHECK: Preds (1): B1
163 // CHECK: [B1 (ENTRY)]
164 // CHECK: Succs (1): B0
165 // CHECK: [B0 (EXIT)]
166 // CHECK: Preds (1): B1
167 // CHECK: [B2 (ENTRY)]
168 // CHECK: Succs (1): B1
169 // CHECK: [B1]
170 // CHECK: 1: 1
171 // CHECK: 2: return [B1.1];
172 // CHECK: Preds (1): B2
173 // CHECK: Succs (1): B0
174 // CHECK: [B0 (EXIT)]
175 // CHECK: Preds (1): B1
176 // CHECK: [B2 (ENTRY)]
177 // CHECK: Succs (1): B1
178 // CHECK: [B1]
179 // CHECK: 1: (CXXConstructExpr, class A)
180 // CHECK: 2: A a;
181 // CHECK: 3: a
182 // CHECK: 4: [B1.3] (ImplicitCastExpr, NoOp, const class A)
183 // CHECK: 5: const A &b = a;
184 // CHECK: 6: A() (CXXConstructExpr, class A)
185 // CHECK: 7: [B1.6] (BindTemporary)
186 // CHECK: 8: [B1.7] (ImplicitCastExpr, NoOp, const class A)
187 // CHECK: 9: [B1.8]
188 // CHECK: 10: const A &c = A();
189 // CHECK: 11: [B1.10].~A() (Implicit destructor)
190 // CHECK: 12: [B1.2].~A() (Implicit destructor)
191 // CHECK: Preds (1): B2
192 // CHECK: Succs (1): B0
193 // CHECK: [B0 (EXIT)]
194 // CHECK: Preds (1): B1
195 // CHECK: [B2 (ENTRY)]
196 // CHECK: Succs (1): B1
197 // CHECK: [B1]
198 // CHECK: 1: (CXXConstructExpr, class A [2])
199 // CHECK: 2: A a[2];
200 // CHECK: 3: (CXXConstructExpr, class A [0])
201 // CHECK: 4: A b[0];
202 // CHECK: 5: [B1.2].~A() (Implicit destructor)
203 // CHECK: Preds (1): B2
204 // CHECK: Succs (1): B0
205 // CHECK: [B0 (EXIT)]
206 // CHECK: Preds (1): B1
207 // CHECK: [B2 (ENTRY)]
208 // CHECK: Succs (1): B1
209 // CHECK: [B1]
210 // CHECK: 1: (CXXConstructExpr, class A)
211 // CHECK: 2: A a;
212 // CHECK: 3: (CXXConstructExpr, class A)
213 // CHECK: 4: A c;
214 // CHECK: 5: (CXXConstructExpr, class A)
215 // CHECK: 6: A d;
216 // CHECK: 7: [B1.6].~A() (Implicit destructor)
217 // CHECK: 8: [B1.4].~A() (Implicit destructor)
218 // CHECK: 9: (CXXConstructExpr, class A)
219 // CHECK: 10: A b;
220 // CHECK: 11: [B1.10].~A() (Implicit destructor)
221 // CHECK: 12: [B1.2].~A() (Implicit destructor)
222 // CHECK: Preds (1): B2
223 // CHECK: Succs (1): B0
224 // CHECK: [B0 (EXIT)]
225 // CHECK: Preds (1): B1
226 // CHECK: [B4 (ENTRY)]
227 // CHECK: Succs (1): B3
228 // CHECK: [B1]
229 // CHECK: 1: (CXXConstructExpr, class A)
230 // CHECK: 2: A c;
231 // CHECK: 3: [B1.2].~A() (Implicit destructor)
232 // CHECK: 4: [B3.4].~A() (Implicit destructor)
233 // CHECK: 5: [B3.2].~A() (Implicit destructor)
234 // CHECK: Preds (1): B3
235 // CHECK: Succs (1): B0
236 // CHECK: [B2]
237 // CHECK: 1: return;
238 // CHECK: 2: [B3.4].~A() (Implicit destructor)
239 // CHECK: 3: [B3.2].~A() (Implicit destructor)
240 // CHECK: Preds (1): B3
241 // CHECK: Succs (1): B0
242 // CHECK: [B3]
243 // CHECK: 1: (CXXConstructExpr, class A)
244 // CHECK: 2: A a;
245 // CHECK: 3: (CXXConstructExpr, class A)
246 // CHECK: 4: A b;
247 // CHECK: 5: UV
248 // CHECK: 6: [B3.5] (ImplicitCastExpr, LValueToRValue, _Bool)
249 // CHECK: T: if [B3.6]
250 // CHECK: Preds (1): B4
251 // CHECK: Succs (2): B2 B1
252 // CHECK: [B0 (EXIT)]
253 // CHECK: Preds (2): B1 B2
254 // CHECK: [B8 (ENTRY)]
255 // CHECK: Succs (1): B7
256 // CHECK: [B1]
257 // CHECK: l1:
258 // CHECK: 1: (CXXConstructExpr, class A)
259 // CHECK: 2: A c;
260 // CHECK: 3: [B1.2].~A() (Implicit destructor)
261 // CHECK: 4: [B6.2].~A() (Implicit destructor)
262 // CHECK: 5: [B7.2].~A() (Implicit destructor)
263 // CHECK: Preds (2): B2 B3
264 // CHECK: Succs (1): B0
265 // CHECK: [B2]
266 // CHECK: 1: (CXXConstructExpr, class A)
267 // CHECK: 2: A b;
268 // CHECK: 3: [B2.2].~A() (Implicit destructor)
269 // CHECK: 4: [B6.4].~A() (Implicit destructor)
270 // CHECK: Preds (1): B4
271 // CHECK: Succs (1): B1
272 // CHECK: [B3]
273 // CHECK: 1: [B6.4].~A() (Implicit destructor)
274 // CHECK: T: goto l1;
275 // CHECK: Preds (1): B4
276 // CHECK: Succs (1): B1
277 // CHECK: [B4]
278 // CHECK: 1: UV
279 // CHECK: 2: [B4.1] (ImplicitCastExpr, LValueToRValue, _Bool)
280 // CHECK: T: if [B4.2]
281 // CHECK: Preds (1): B6
282 // CHECK: Succs (2): B3 B2
283 // CHECK: [B5]
284 // CHECK: 1: [B6.4].~A() (Implicit destructor)
285 // CHECK: 2: [B6.2].~A() (Implicit destructor)
286 // CHECK: T: goto l0;
287 // CHECK: Preds (1): B6
288 // CHECK: Succs (1): B6
289 // CHECK: [B6]
290 // CHECK: l0:
291 // CHECK: 1: (CXXConstructExpr, class A)
292 // CHECK: 2: A b;
293 // CHECK: 3: (CXXConstructExpr, class A)
294 // CHECK: 4: A a;
295 // CHECK: 5: UV
296 // CHECK: 6: [B6.5] (ImplicitCastExpr, LValueToRValue, _Bool)
297 // CHECK: T: if [B6.6]
298 // CHECK: Preds (2): B7 B5
299 // CHECK: Succs (2): B5 B4
300 // CHECK: [B7]
301 // CHECK: 1: (CXXConstructExpr, class A)
302 // CHECK: 2: A a;
303 // CHECK: Preds (1): B8
304 // CHECK: Succs (1): B6
305 // CHECK: [B0 (EXIT)]
306 // CHECK: Preds (1): B1
307 // CHECK: [B5 (ENTRY)]
308 // CHECK: Succs (1): B4
309 // CHECK: [B1]
310 // CHECK: 1: [B4.6].~A() (Implicit destructor)
311 // CHECK: 2: [B4.2].~A() (Implicit destructor)
312 // CHECK: Preds (2): B2 B3
313 // CHECK: Succs (1): B0
314 // CHECK: [B2]
315 // CHECK: 1: (CXXConstructExpr, class A)
316 // CHECK: 2: A c;
317 // CHECK: 3: [B2.2].~A() (Implicit destructor)
318 // CHECK: Preds (1): B4
319 // CHECK: Succs (1): B1
320 // CHECK: [B3]
321 // CHECK: 1: (CXXConstructExpr, class A)
322 // CHECK: 2: A c;
323 // CHECK: 3: [B3.2].~A() (Implicit destructor)
324 // CHECK: Preds (1): B4
325 // CHECK: Succs (1): B1
326 // CHECK: [B4]
327 // CHECK: 1: (CXXConstructExpr, class A)
328 // CHECK: 2: A a;
329 // CHECK: 3: a
330 // CHECK: 4: [B4.3] (ImplicitCastExpr, NoOp, const class A)
331 // CHECK: 5: [B4.4] (CXXConstructExpr, class A)
332 // CHECK: 6: A b = a;
333 // CHECK: 7: b
334 // CHECK: 8: [B4.7] (ImplicitCastExpr, NoOp, const class A)
335 // CHECK: 9: [B4.8].operator int
336 // CHECK: 10: [B4.9]()
337 // CHECK: 11: [B4.10] (ImplicitCastExpr, UserDefinedConversion, int)
338 // CHECK: 12: [B4.11] (ImplicitCastExpr, IntegralToBoolean, _Bool)
339 // CHECK: T: if [B4.12]
340 // CHECK: Preds (1): B5
341 // CHECK: Succs (2): B3 B2
342 // CHECK: [B0 (EXIT)]
343 // CHECK: Preds (1): B1
344 // CHECK: [B9 (ENTRY)]
345 // CHECK: Succs (1): B8
346 // CHECK: [B1]
347 // CHECK: 1: [B8.6].~A() (Implicit destructor)
348 // CHECK: 2: (CXXConstructExpr, class A)
349 // CHECK: 3: A e;
350 // CHECK: 4: [B1.3].~A() (Implicit destructor)
351 // CHECK: 5: [B8.2].~A() (Implicit destructor)
352 // CHECK: Preds (2): B2 B5
353 // CHECK: Succs (1): B0
354 // CHECK: [B2]
355 // CHECK: 1: (CXXConstructExpr, class A)
356 // CHECK: 2: A d;
357 // CHECK: 3: [B2.2].~A() (Implicit destructor)
358 // CHECK: 4: [B4.2].~A() (Implicit destructor)
359 // CHECK: Preds (1): B4
360 // CHECK: Succs (1): B1
361 // CHECK: [B3]
362 // CHECK: 1: return;
363 // CHECK: 2: [B4.2].~A() (Implicit destructor)
364 // CHECK: 3: [B8.6].~A() (Implicit destructor)
365 // CHECK: 4: [B8.2].~A() (Implicit destructor)
366 // CHECK: Preds (1): B4
367 // CHECK: Succs (1): B0
368 // CHECK: [B4]
369 // CHECK: 1: (CXXConstructExpr, class A)
370 // CHECK: 2: A c;
371 // CHECK: 3: UV
372 // CHECK: 4: [B4.3] (ImplicitCastExpr, LValueToRValue, _Bool)
373 // CHECK: T: if [B4.4]
374 // CHECK: Preds (1): B8
375 // CHECK: Succs (2): B3 B2
376 // CHECK: [B5]
377 // CHECK: 1: (CXXConstructExpr, class A)
378 // CHECK: 2: A d;
379 // CHECK: 3: [B5.2].~A() (Implicit destructor)
380 // CHECK: 4: [B7.2].~A() (Implicit destructor)
381 // CHECK: Preds (1): B7
382 // CHECK: Succs (1): B1
383 // CHECK: [B6]
384 // CHECK: 1: return;
385 // CHECK: 2: [B7.2].~A() (Implicit destructor)
386 // CHECK: 3: [B8.6].~A() (Implicit destructor)
387 // CHECK: 4: [B8.2].~A() (Implicit destructor)
388 // CHECK: Preds (1): B7
389 // CHECK: Succs (1): B0
390 // CHECK: [B7]
391 // CHECK: 1: (CXXConstructExpr, class A)
392 // CHECK: 2: A c;
393 // CHECK: 3: UV
394 // CHECK: 4: [B7.3] (ImplicitCastExpr, LValueToRValue, _Bool)
395 // CHECK: T: if [B7.4]
396 // CHECK: Preds (1): B8
397 // CHECK: Succs (2): B6 B5
398 // CHECK: [B8]
399 // CHECK: 1: (CXXConstructExpr, class A)
400 // CHECK: 2: A a;
401 // CHECK: 3: a
402 // CHECK: 4: [B8.3] (ImplicitCastExpr, NoOp, const class A)
403 // CHECK: 5: [B8.4] (CXXConstructExpr, class A)
404 // CHECK: 6: A b = a;
405 // CHECK: 7: b
406 // CHECK: 8: [B8.7] (ImplicitCastExpr, NoOp, const class A)
407 // CHECK: 9: [B8.8].operator int
408 // CHECK: 10: [B8.9]()
409 // CHECK: 11: [B8.10] (ImplicitCastExpr, UserDefinedConversion, int)
410 // CHECK: 12: [B8.11] (ImplicitCastExpr, IntegralToBoolean, _Bool)
411 // CHECK: T: if [B8.12]
412 // CHECK: Preds (1): B9
413 // CHECK: Succs (2): B7 B4
414 // CHECK: [B0 (EXIT)]
415 // CHECK: Preds (3): B1 B3 B6
416 // CHECK: [B6 (ENTRY)]
417 // CHECK: Succs (1): B5
418 // CHECK: [B1]
419 // CHECK: 1: [B4.4].~A() (Implicit destructor)
420 // CHECK: 2: [B5.2].~A() (Implicit destructor)
421 // CHECK: Preds (1): B4
422 // CHECK: Succs (1): B0
423 // CHECK: [B2]
424 // CHECK: Preds (1): B3
425 // CHECK: Succs (1): B4
426 // CHECK: [B3]
427 // CHECK: 1: (CXXConstructExpr, class A)
428 // CHECK: 2: A c;
429 // CHECK: 3: [B3.2].~A() (Implicit destructor)
430 // CHECK: 4: [B4.4].~A() (Implicit destructor)
431 // CHECK: Preds (1): B4
432 // CHECK: Succs (1): B2
433 // CHECK: [B4]
434 // CHECK: 1: a
435 // CHECK: 2: [B4.1] (ImplicitCastExpr, NoOp, const class A)
436 // CHECK: 3: [B4.2] (CXXConstructExpr, class A)
437 // CHECK: 4: A b = a;
438 // CHECK: 5: b
439 // CHECK: 6: [B4.5] (ImplicitCastExpr, NoOp, const class A)
440 // CHECK: 7: [B4.6].operator int
441 // CHECK: 8: [B4.7]()
442 // CHECK: 9: [B4.8] (ImplicitCastExpr, UserDefinedConversion, int)
443 // CHECK: 10: [B4.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
444 // CHECK: T: while [B4.10]
445 // CHECK: Preds (2): B2 B5
446 // CHECK: Succs (2): B3 B1
447 // CHECK: [B5]
448 // CHECK: 1: (CXXConstructExpr, class A)
449 // CHECK: 2: A a;
450 // CHECK: Preds (1): B6
451 // CHECK: Succs (1): B4
452 // CHECK: [B0 (EXIT)]
453 // CHECK: Preds (1): B1
454 // CHECK: [B12 (ENTRY)]
455 // CHECK: Succs (1): B11
456 // CHECK: [B1]
457 // CHECK: 1: [B10.4].~A() (Implicit destructor)
458 // CHECK: 2: (CXXConstructExpr, class A)
459 // CHECK: 3: A e;
460 // CHECK: 4: [B1.3].~A() (Implicit destructor)
461 // CHECK: 5: [B11.2].~A() (Implicit destructor)
462 // CHECK: Preds (2): B8 B10
463 // CHECK: Succs (1): B0
464 // CHECK: [B2]
465 // CHECK: Preds (2): B3 B6
466 // CHECK: Succs (1): B10
467 // CHECK: [B3]
468 // CHECK: 1: (CXXConstructExpr, class A)
469 // CHECK: 2: A d;
470 // CHECK: 3: [B3.2].~A() (Implicit destructor)
471 // CHECK: 4: [B9.2].~A() (Implicit destructor)
472 // CHECK: 5: [B10.4].~A() (Implicit destructor)
473 // CHECK: Preds (1): B5
474 // CHECK: Succs (1): B2
475 // CHECK: [B4]
476 // CHECK: 1: return;
477 // CHECK: 2: [B9.2].~A() (Implicit destructor)
478 // CHECK: 3: [B10.4].~A() (Implicit destructor)
479 // CHECK: 4: [B11.2].~A() (Implicit destructor)
480 // CHECK: Preds (1): B5
481 // CHECK: Succs (1): B0
482 // CHECK: [B5]
483 // CHECK: 1: UV
484 // CHECK: 2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool)
485 // CHECK: T: if [B5.2]
486 // CHECK: Preds (1): B7
487 // CHECK: Succs (2): B4 B3
488 // CHECK: [B6]
489 // CHECK: 1: [B9.2].~A() (Implicit destructor)
490 // CHECK: 2: [B10.4].~A() (Implicit destructor)
491 // CHECK: T: continue;
492 // CHECK: Preds (1): B7
493 // CHECK: Succs (1): B2
494 // CHECK: [B7]
495 // CHECK: 1: UV
496 // CHECK: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)
497 // CHECK: T: if [B7.2]
498 // CHECK: Preds (1): B9
499 // CHECK: Succs (2): B6 B5
500 // CHECK: [B8]
501 // CHECK: 1: [B9.2].~A() (Implicit destructor)
502 // CHECK: T: break;
503 // CHECK: Preds (1): B9
504 // CHECK: Succs (1): B1
505 // CHECK: [B9]
506 // CHECK: 1: (CXXConstructExpr, class A)
507 // CHECK: 2: A c;
508 // CHECK: 3: UV
509 // CHECK: 4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool)
510 // CHECK: T: if [B9.4]
511 // CHECK: Preds (1): B10
512 // CHECK: Succs (2): B8 B7
513 // CHECK: [B10]
514 // CHECK: 1: a
515 // CHECK: 2: [B10.1] (ImplicitCastExpr, NoOp, const class A)
516 // CHECK: 3: [B10.2] (CXXConstructExpr, class A)
517 // CHECK: 4: A b = a;
518 // CHECK: 5: b
519 // CHECK: 6: [B10.5] (ImplicitCastExpr, NoOp, const class A)
520 // CHECK: 7: [B10.6].operator int
521 // CHECK: 8: [B10.7]()
522 // CHECK: 9: [B10.8] (ImplicitCastExpr, UserDefinedConversion, int)
523 // CHECK: 10: [B10.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
524 // CHECK: T: while [B10.10]
525 // CHECK: Preds (2): B2 B11
526 // CHECK: Succs (2): B9 B1
527 // CHECK: [B11]
528 // CHECK: 1: (CXXConstructExpr, class A)
529 // CHECK: 2: A a;
530 // CHECK: Preds (1): B12
531 // CHECK: Succs (1): B10
532 // CHECK: [B0 (EXIT)]
533 // CHECK: Preds (2): B1 B4
534 // CHECK: [B4 (ENTRY)]
535 // CHECK: Succs (1): B2
536 // CHECK: [B1]
537 // CHECK: 1: UV
538 // CHECK: 2: [B1.1] (ImplicitCastExpr, LValueToRValue, _Bool)
539 // CHECK: T: do ... while [B1.2]
540 // CHECK: Preds (1): B2
541 // CHECK: Succs (2): B3 B0
542 // CHECK: [B2]
543 // CHECK: 1: (CXXConstructExpr, class A)
544 // CHECK: 2: A a;
545 // CHECK: 3: [B2.2].~A() (Implicit destructor)
546 // CHECK: Preds (2): B3 B4
547 // CHECK: Succs (1): B1
548 // CHECK: [B3]
549 // CHECK: Preds (1): B1
550 // CHECK: Succs (1): B2
551 // CHECK: [B0 (EXIT)]
552 // CHECK: Preds (1): B1
553 // CHECK: [B12 (ENTRY)]
554 // CHECK: Succs (1): B11
555 // CHECK: [B1]
556 // CHECK: 1: (CXXConstructExpr, class A)
557 // CHECK: 2: A d;
558 // CHECK: 3: [B1.2].~A() (Implicit destructor)
559 // CHECK: 4: [B11.2].~A() (Implicit destructor)
560 // CHECK: Preds (2): B8 B2
561 // CHECK: Succs (1): B0
562 // CHECK: [B2]
563 // CHECK: 1: UV
564 // CHECK: 2: [B2.1] (ImplicitCastExpr, LValueToRValue, _Bool)
565 // CHECK: T: do ... while [B2.2]
566 // CHECK: Preds (2): B3 B6
567 // CHECK: Succs (2): B10 B1
568 // CHECK: [B3]
569 // CHECK: 1: (CXXConstructExpr, class A)
570 // CHECK: 2: A c;
571 // CHECK: 3: [B3.2].~A() (Implicit destructor)
572 // CHECK: 4: [B9.2].~A() (Implicit destructor)
573 // CHECK: Preds (1): B5
574 // CHECK: Succs (1): B2
575 // CHECK: [B4]
576 // CHECK: 1: return;
577 // CHECK: 2: [B9.2].~A() (Implicit destructor)
578 // CHECK: 3: [B11.2].~A() (Implicit destructor)
579 // CHECK: Preds (1): B5
580 // CHECK: Succs (1): B0
581 // CHECK: [B5]
582 // CHECK: 1: UV
583 // CHECK: 2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool)
584 // CHECK: T: if [B5.2]
585 // CHECK: Preds (1): B7
586 // CHECK: Succs (2): B4 B3
587 // CHECK: [B6]
588 // CHECK: 1: [B9.2].~A() (Implicit destructor)
589 // CHECK: T: continue;
590 // CHECK: Preds (1): B7
591 // CHECK: Succs (1): B2
592 // CHECK: [B7]
593 // CHECK: 1: UV
594 // CHECK: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)
595 // CHECK: T: if [B7.2]
596 // CHECK: Preds (1): B9
597 // CHECK: Succs (2): B6 B5
598 // CHECK: [B8]
599 // CHECK: 1: [B9.2].~A() (Implicit destructor)
600 // CHECK: T: break;
601 // CHECK: Preds (1): B9
602 // CHECK: Succs (1): B1
603 // CHECK: [B9]
604 // CHECK: 1: (CXXConstructExpr, class A)
605 // CHECK: 2: A b;
606 // CHECK: 3: UV
607 // CHECK: 4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool)
608 // CHECK: T: if [B9.4]
609 // CHECK: Preds (2): B10 B11
610 // CHECK: Succs (2): B8 B7
611 // CHECK: [B10]
612 // CHECK: Preds (1): B2
613 // CHECK: Succs (1): B9
614 // CHECK: [B11]
615 // CHECK: 1: (CXXConstructExpr, class A)
616 // CHECK: 2: A a;
617 // CHECK: Preds (1): B12
618 // CHECK: Succs (1): B9
619 // CHECK: [B0 (EXIT)]
620 // CHECK: Preds (2): B1 B4
621 // CHECK: [B4 (ENTRY)]
622 // CHECK: Succs (1): B2
623 // CHECK: [B1]
624 // CHECK: 1: [B2.6].~A() (Implicit destructor)
625 // CHECK: 2: [B2.2].~A() (Implicit destructor)
626 // CHECK: Preds (2): B3 B2
627 // CHECK: Succs (1): B0
628 // CHECK: [B2]
629 // CHECK: 1: (CXXConstructExpr, class A)
630 // CHECK: 2: A a;
631 // CHECK: 3: a
632 // CHECK: 4: [B2.3] (ImplicitCastExpr, NoOp, const class A)
633 // CHECK: 5: [B2.4] (CXXConstructExpr, class A)
634 // CHECK: 6: A b = a;
635 // CHECK: 7: b
636 // CHECK: 8: [B2.7] (ImplicitCastExpr, NoOp, const class A)
637 // CHECK: 9: [B2.8].operator int
638 // CHECK: 10: [B2.9]()
639 // CHECK: 11: [B2.10] (ImplicitCastExpr, UserDefinedConversion, int)
640 // CHECK: T: switch [B2.11]
641 // CHECK: Preds (1): B4
642 // CHECK: Succs (1): B1
643 // CHECK: [B3]
644 // CHECK: 1: (CXXConstructExpr, class A)
645 // CHECK: 2: A c;
646 // CHECK: 3: [B3.2].~A() (Implicit destructor)
647 // CHECK: Succs (1): B1
648 // CHECK: [B0 (EXIT)]
649 // CHECK: Preds (1): B1
650 // CHECK: [B9 (ENTRY)]
651 // CHECK: Succs (1): B2
652 // CHECK: [B1]
653 // CHECK: 1: [B2.6].~A() (Implicit destructor)
654 // CHECK: 2: (CXXConstructExpr, class A)
655 // CHECK: 3: A g;
656 // CHECK: 4: [B1.3].~A() (Implicit destructor)
657 // CHECK: 5: [B2.2].~A() (Implicit destructor)
658 // CHECK: Preds (3): B3 B7 B2
659 // CHECK: Succs (1): B0
660 // CHECK: [B2]
661 // CHECK: 1: (CXXConstructExpr, class A)
662 // CHECK: 2: A a;
663 // CHECK: 3: a
664 // CHECK: 4: [B2.3] (ImplicitCastExpr, NoOp, const class A)
665 // CHECK: 5: [B2.4] (CXXConstructExpr, class A)
666 // CHECK: 6: A b = a;
667 // CHECK: 7: b
668 // CHECK: 8: [B2.7] (ImplicitCastExpr, NoOp, const class A)
669 // CHECK: 9: [B2.8].operator int
670 // CHECK: 10: [B2.9]()
671 // CHECK: 11: [B2.10] (ImplicitCastExpr, UserDefinedConversion, int)
672 // CHECK: T: switch [B2.11]
673 // CHECK: Preds (1): B9
674 // CHECK: Succs (3): B3 B8
675 // CHECK: B1
676 // CHECK: [B3]
677 // CHECK: case 1:
678 // CHECK: T: break;
679 // CHECK: Preds (2): B2 B4
680 // CHECK: Succs (1): B1
681 // CHECK: [B4]
682 // CHECK: 1: (CXXConstructExpr, class A)
683 // CHECK: 2: A f;
684 // CHECK: 3: [B4.2].~A() (Implicit destructor)
685 // CHECK: 4: [B8.2].~A() (Implicit destructor)
686 // CHECK: Preds (1): B6
687 // CHECK: Succs (1): B3
688 // CHECK: [B5]
689 // CHECK: 1: return;
690 // CHECK: 2: [B8.2].~A() (Implicit destructor)
691 // CHECK: 3: [B2.6].~A() (Implicit destructor)
692 // CHECK: 4: [B2.2].~A() (Implicit destructor)
693 // CHECK: Preds (1): B6
694 // CHECK: Succs (1): B0
695 // CHECK: [B6]
696 // CHECK: 1: UV
697 // CHECK: 2: [B6.1] (ImplicitCastExpr, LValueToRValue, _Bool)
698 // CHECK: T: if [B6.2]
699 // CHECK: Preds (1): B8
700 // CHECK: Succs (2): B5 B4
701 // CHECK: [B7]
702 // CHECK: 1: [B8.2].~A() (Implicit destructor)
703 // CHECK: T: break;
704 // CHECK: Preds (1): B8
705 // CHECK: Succs (1): B1
706 // CHECK: [B8]
707 // CHECK: case 0:
708 // CHECK: 1: (CXXConstructExpr, class A)
709 // CHECK: 2: A c;
710 // CHECK: 3: UV
711 // CHECK: 4: [B8.3] (ImplicitCastExpr, LValueToRValue, _Bool)
712 // CHECK: T: if [B8.4]
713 // CHECK: Preds (1): B2
714 // CHECK: Succs (2): B7 B6
715 // CHECK: [B0 (EXIT)]
716 // CHECK: Preds (2): B1 B5
717 // CHECK: [B6 (ENTRY)]
718 // CHECK: Succs (1): B5
719 // CHECK: [B1]
720 // CHECK: 1: [B4.4].~A() (Implicit destructor)
721 // CHECK: 2: [B5.2].~A() (Implicit destructor)
722 // CHECK: Preds (1): B4
723 // CHECK: Succs (1): B0
724 // CHECK: [B2]
725 // CHECK: Preds (1): B3
726 // CHECK: Succs (1): B4
727 // CHECK: [B3]
728 // CHECK: 1: (CXXConstructExpr, class A)
729 // CHECK: 2: A c;
730 // CHECK: 3: [B3.2].~A() (Implicit destructor)
731 // CHECK: 4: [B4.4].~A() (Implicit destructor)
732 // CHECK: Preds (1): B4
733 // CHECK: Succs (1): B2
734 // CHECK: [B4]
735 // CHECK: 1: a
736 // CHECK: 2: [B4.1] (ImplicitCastExpr, NoOp, const class A)
737 // CHECK: 3: [B4.2] (CXXConstructExpr, class A)
738 // CHECK: 4: A b = a;
739 // CHECK: 5: b
740 // CHECK: 6: [B4.5] (ImplicitCastExpr, NoOp, const class A)
741 // CHECK: 7: [B4.6].operator int
742 // CHECK: 8: [B4.7]()
743 // CHECK: 9: [B4.8] (ImplicitCastExpr, UserDefinedConversion, int)
744 // CHECK: 10: [B4.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
745 // CHECK: T: for (...; [B4.10]; )
746 // CHECK: Preds (2): B2 B5
747 // CHECK: Succs (2): B3 B1
748 // CHECK: [B5]
749 // CHECK: 1: (CXXConstructExpr, class A)
750 // CHECK: 2: A a;
751 // CHECK: Preds (1): B6
752 // CHECK: Succs (1): B4
753 // CHECK: [B0 (EXIT)]
754 // CHECK: Preds (1): B1
755 // CHECK: [B12 (ENTRY)]
756 // CHECK: Succs (1): B11
757 // CHECK: [B1]
758 // CHECK: 1: [B10.4].~A() (Implicit destructor)
759 // CHECK: 2: [B11.4].~A() (Implicit destructor)
760 // CHECK: 3: (CXXConstructExpr, class A)
761 // CHECK: 4: A f;
762 // CHECK: 5: [B1.4].~A() (Implicit destructor)
763 // CHECK: 6: [B11.2].~A() (Implicit destructor)
764 // CHECK: Preds (2): B8 B10
765 // CHECK: Succs (1): B0
766 // CHECK: [B2]
767 // CHECK: Preds (2): B3 B6
768 // CHECK: Succs (1): B10
769 // CHECK: [B3]
770 // CHECK: 1: (CXXConstructExpr, class A)
771 // CHECK: 2: A e;
772 // CHECK: 3: [B3.2].~A() (Implicit destructor)
773 // CHECK: 4: [B9.2].~A() (Implicit destructor)
774 // CHECK: 5: [B10.4].~A() (Implicit destructor)
775 // CHECK: Preds (1): B5
776 // CHECK: Succs (1): B2
777 // CHECK: [B4]
778 // CHECK: 1: return;
779 // CHECK: 2: [B9.2].~A() (Implicit destructor)
780 // CHECK: 3: [B10.4].~A() (Implicit destructor)
781 // CHECK: 4: [B11.4].~A() (Implicit destructor)
782 // CHECK: 5: [B11.2].~A() (Implicit destructor)
783 // CHECK: Preds (1): B5
784 // CHECK: Succs (1): B0
785 // CHECK: [B5]
786 // CHECK: 1: UV
787 // CHECK: 2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool)
788 // CHECK: T: if [B5.2]
789 // CHECK: Preds (1): B7
790 // CHECK: Succs (2): B4 B3
791 // CHECK: [B6]
792 // CHECK: 1: [B9.2].~A() (Implicit destructor)
793 // CHECK: T: continue;
794 // CHECK: Preds (1): B7
795 // CHECK: Succs (1): B2
796 // CHECK: [B7]
797 // CHECK: 1: UV
798 // CHECK: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)
799 // CHECK: T: if [B7.2]
800 // CHECK: Preds (1): B9
801 // CHECK: Succs (2): B6 B5
802 // CHECK: [B8]
803 // CHECK: 1: [B9.2].~A() (Implicit destructor)
804 // CHECK: T: break;
805 // CHECK: Preds (1): B9
806 // CHECK: Succs (1): B1
807 // CHECK: [B9]
808 // CHECK: 1: (CXXConstructExpr, class A)
809 // CHECK: 2: A d;
810 // CHECK: 3: UV
811 // CHECK: 4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool)
812 // CHECK: T: if [B9.4]
813 // CHECK: Preds (1): B10
814 // CHECK: Succs (2): B8 B7
815 // CHECK: [B10]
816 // CHECK: 1: b
817 // CHECK: 2: [B10.1] (ImplicitCastExpr, NoOp, const class A)
818 // CHECK: 3: [B10.2] (CXXConstructExpr, class A)
819 // CHECK: 4: A c = b;
820 // CHECK: 5: c
821 // CHECK: 6: [B10.5] (ImplicitCastExpr, NoOp, const class A)
822 // CHECK: 7: [B10.6].operator int
823 // CHECK: 8: [B10.7]()
824 // CHECK: 9: [B10.8] (ImplicitCastExpr, UserDefinedConversion, int)
825 // CHECK: 10: [B10.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
826 // CHECK: T: for (...; [B10.10]; )
827 // CHECK: Preds (2): B2 B11
828 // CHECK: Succs (2): B9 B1
829 // CHECK: [B11]
830 // CHECK: 1: (CXXConstructExpr, class A)
831 // CHECK: 2: A a;
832 // CHECK: 3: (CXXConstructExpr, class A)
833 // CHECK: 4: A b;
834 // CHECK: Preds (1): B12
835 // CHECK: Succs (1): B10
836 // CHECK: [B0 (EXIT)]
837 // CHECK: Preds (2): B1 B4
838 // CHECK: [B3 (ENTRY)]
839 // CHECK: Succs (1): B0
840 // CHECK: [B1]
841 // CHECK: T: try ...
842 // CHECK: Succs (2): B2 B0
843 // CHECK: [B2]
844 // CHECK: catch (const A &e):
845 // CHECK: 1: catch (const A &e) {
846 // CHECK: }
847 // CHECK: Preds (1): B1
848 // CHECK: Succs (1): B0
849 // CHECK: [B0 (EXIT)]
850 // CHECK: Preds (3): B2 B1 B3
851 // CHECK: [B3 (ENTRY)]
852 // CHECK: Succs (1): B0
853 // CHECK: [B1]
854 // CHECK: T: try ...
855 // CHECK: Succs (2): B2 B0
856 // CHECK: [B2]
857 // CHECK: catch (A e):
858 // CHECK: 1: catch (A e) {
859 // CHECK: }
860 // CHECK: 2: [B2.1].~A() (Implicit destructor)
861 // CHECK: Preds (1): B1
862 // CHECK: Succs (1): B0
863 // CHECK: [B0 (EXIT)]
864 // CHECK: Preds (3): B2 B1 B3
865
866