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