blob: 1ddccb704b132d8b1719169d4dff37b4a8191409 [file] [log] [blame]
Ted Kremenek3f635c02012-07-14 05:04:10 +00001// RUN: rm -f %t
Jordan Rose81fb50e2012-09-10 21:27:35 +00002// RUN: %clang_cc1 -analyze -analyzer-checker=debug.DumpCFG -analyzer-config cfg-temporary-dtors=true %s > %t 2>&1
Ted Kremenek3f635c02012-07-14 05:04:10 +00003// RUN: FileCheck --input-file=%t %s
Dmitri Gribenko10442562013-01-26 00:36:14 +00004// XPASS: *
Marcin Swiderski8599e762010-11-03 06:19:35 +00005
6class A {
7public:
8 A() {}
9 ~A() {}
10
11 static A make() { return A(); }
12
13 operator bool() { return false; }
14 operator int() { return 0; }
15};
16
17class B {
18public:
19 B() {}
20 ~B() {}
21
22 operator bool() { return true; }
23 operator int() { return 1; }
24 operator A() { return A(); }
25};
26
27void foo(int);
28void foo(bool);
29void foo(const A&);
30
31void test_binary() {
32 int a = int(A()) + int(B());
33 foo(int(A()) + int(B()));
34 int b;
35}
36
37void test_and() {
38 bool a = A() && B();
39 foo(A() && B());
40 int b;
41}
42
43void test_or() {
44 bool a = A() || B();
45 foo(A() || B());
46 int b;
47}
48
49void test_cond() {
50 A a = B() ? A() : A(B());
51 if (B()) { foo(0); } else { foo(0); }
52 int b;
53}
54
55void test_cond_cref() {
56 const A& a = B() ? A() : A(B());
57 foo(B() ? A() : A(B()));
58 int b;
59}
60
61void test_cond_implicit() {
62 A a = A() ?: A();
63 int b;
64}
65
66void test_cond_implicit_cref() {
67 const A& a = A() ?: A();
68 foo(A() ?: A());
69 int b;
70}
71
72void test_copy_init() {
73 A a = A();
74 int b;
75}
76
77void test_cref_init() {
78 const A& a = A();
79 foo(A());
80 int b;
81}
82
83void test_call_copy_init() {
84 A a = A::make();
85 int b;
86}
87
88void test_call_cref_init() {
89 const A& a = A::make();
90 foo(A::make());
91 int b;
92}
93
94void test_assign() {
95 int a;
96 a = A();
97 int b;
98}
99
100class TestCtorInits {
101 int a;
102 int b;
103public:
104 TestCtorInits();
105};
106
107TestCtorInits::TestCtorInits()
108 : a(int(A()) + int(B()))
109 , b() {}
110
Ted Kremenek3f635c02012-07-14 05:04:10 +0000111// CHECK: [B1 (ENTRY)]
112// CHECK: Succs (1): B0
113// CHECK: [B0 (EXIT)]
114// CHECK: Preds (1): B1
115// CHECK: [B1 (ENTRY)]
116// CHECK: Succs (1): B0
117// CHECK: [B0 (EXIT)]
118// CHECK: Preds (1): B1
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000119// CHECK: [B2 (ENTRY)]
120// CHECK: Succs (1): B1
Ted Kremenek3f635c02012-07-14 05:04:10 +0000121// CHECK: [B1]
122// CHECK: 1: A() (CXXConstructExpr, class A)
123// CHECK: 2: [B1.1] (BindTemporary)
124// CHECK: 3: [B1.2] (ImplicitCastExpr, NoOp, const class A)
125// CHECK: 4: [B1.3]
126// CHECK: 5: [B1.4] (CXXConstructExpr, class A)
127// CHECK: 6: ~A() (Temporary object destructor)
128// CHECK: 7: return [B1.5];
129// CHECK: Preds (1): B2
130// CHECK: Succs (1): B0
131// CHECK: [B0 (EXIT)]
132// CHECK: Preds (1): B1
133// CHECK: [B2 (ENTRY)]
134// CHECK: Succs (1): B1
135// CHECK: [B1]
136// CHECK: 1: false
137// CHECK: 2: return [B1.1];
138// CHECK: Preds (1): B2
139// CHECK: Succs (1): B0
140// CHECK: [B0 (EXIT)]
141// CHECK: Preds (1): B1
142// CHECK: [B2 (ENTRY)]
143// CHECK: Succs (1): B1
144// CHECK: [B1]
145// CHECK: 1: 0
146// CHECK: 2: return [B1.1];
147// CHECK: Preds (1): B2
148// CHECK: Succs (1): B0
149// CHECK: [B0 (EXIT)]
150// CHECK: Preds (1): B1
151// CHECK: [B1 (ENTRY)]
152// CHECK: Succs (1): B0
153// CHECK: [B0 (EXIT)]
154// CHECK: Preds (1): B1
155// CHECK: [B1 (ENTRY)]
156// CHECK: Succs (1): B0
157// CHECK: [B0 (EXIT)]
158// CHECK: Preds (1): B1
159// CHECK: [B2 (ENTRY)]
160// CHECK: Succs (1): B1
161// CHECK: [B1]
162// CHECK: 1: true
163// CHECK: 2: return [B1.1];
164// CHECK: Preds (1): B2
165// CHECK: Succs (1): B0
166// CHECK: [B0 (EXIT)]
167// CHECK: Preds (1): B1
168// CHECK: [B2 (ENTRY)]
169// CHECK: Succs (1): B1
170// CHECK: [B1]
171// CHECK: 1: 1
172// CHECK: 2: return [B1.1];
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: A() (CXXConstructExpr, class A)
181// CHECK: 2: [B1.1] (BindTemporary)
182// CHECK: 3: [B1.2] (ImplicitCastExpr, NoOp, const class A)
183// CHECK: 4: [B1.3]
184// CHECK: 5: [B1.4] (CXXConstructExpr, class A)
185// CHECK: 6: ~A() (Temporary object destructor)
186// CHECK: 7: return [B1.5];
187// CHECK: Preds (1): B2
188// CHECK: Succs (1): B0
189// CHECK: [B0 (EXIT)]
190// CHECK: Preds (1): B1
191// CHECK: [B2 (ENTRY)]
192// CHECK: Succs (1): B1
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000193// CHECK: [B1]
194// CHECK: 1: A() (CXXConstructExpr, class A)
195// CHECK: 2: [B1.1] (BindTemporary)
196// CHECK: 3: [B1.2].operator int
197// CHECK: 4: [B1.3]()
198// CHECK: 5: [B1.4] (ImplicitCastExpr, UserDefinedConversion, int)
199// CHECK: 6: int([B1.5]) (CXXFunctionalCastExpr, NoOp, int)
200// CHECK: 7: B() (CXXConstructExpr, class B)
201// CHECK: 8: [B1.7] (BindTemporary)
202// CHECK: 9: [B1.8].operator int
203// CHECK: 10: [B1.9]()
204// CHECK: 11: [B1.10] (ImplicitCastExpr, UserDefinedConversion, int)
205// CHECK: 12: int([B1.11]) (CXXFunctionalCastExpr, NoOp, int)
206// CHECK: 13: [B1.6] + [B1.12]
207// CHECK: 14: int a = int(A().operator int()) + int(B().operator int());
208// CHECK: 15: ~B() (Temporary object destructor)
209// CHECK: 16: ~A() (Temporary object destructor)
Ted Kremenek58467202013-02-05 22:00:19 +0000210// CHECK: 17: foo
211// CHECK: 18: [B1.17] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(int))
212// CHECK: 19: A() (CXXConstructExpr, class A)
213// CHECK: 20: [B1.19] (BindTemporary)
214// CHECK: 21: [B1.20].operator int
215// CHECK: 22: [B1.21]()
216// CHECK: 23: [B1.22] (ImplicitCastExpr, UserDefinedConversion, int)
217// CHECK: 24: int([B1.23]) (CXXFunctionalCastExpr, NoOp, int)
218// CHECK: 25: B() (CXXConstructExpr, class B)
219// CHECK: 26: [B1.25] (BindTemporary)
220// CHECK: 27: [B1.26].operator int
221// CHECK: 28: [B1.27]()
222// CHECK: 29: [B1.28] (ImplicitCastExpr, UserDefinedConversion, int)
223// CHECK: 30: int([B1.29]) (CXXFunctionalCastExpr, NoOp, int)
224// CHECK: 31: [B1.24] + [B1.30]
225// CHECK: 32: [B1.18]([B1.31])
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000226// CHECK: 33: ~B() (Temporary object destructor)
227// CHECK: 34: ~A() (Temporary object destructor)
228// CHECK: 35: int b;
229// CHECK: Preds (1): B2
230// CHECK: Succs (1): B0
231// CHECK: [B0 (EXIT)]
232// CHECK: Preds (1): B1
233// CHECK: [B10 (ENTRY)]
Ted Kremenek3f635c02012-07-14 05:04:10 +0000234// CHECK: Succs (1): B9
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000235// CHECK: [B1]
236// CHECK: 1: ~A() (Temporary object destructor)
237// CHECK: 2: int b;
238// CHECK: Preds (2): B2 B3
239// CHECK: Succs (1): B0
240// CHECK: [B2]
241// CHECK: 1: ~B() (Temporary object destructor)
242// CHECK: Preds (1): B3
243// CHECK: Succs (1): B1
244// CHECK: [B3]
Ted Kremenek58467202013-02-05 22:00:19 +0000245// CHECK: 1: [B5.8] && [B4.5]
246// CHECK: 2: [B5.3]([B3.1])
247// CHECK: T: [B5.8] && ...
Ted Kremenek3f635c02012-07-14 05:04:10 +0000248// CHECK: Preds (2): B4 B5
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000249// CHECK: Succs (2): B2 B1
250// CHECK: [B4]
Ted Kremenek3f635c02012-07-14 05:04:10 +0000251// CHECK: 1: B() (CXXConstructExpr, class B)
252// CHECK: 2: [B4.1] (BindTemporary)
253// CHECK: 3: [B4.2].operator _Bool
254// CHECK: 4: [B4.3]()
255// CHECK: 5: [B4.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
256// CHECK: Preds (1): B5
257// CHECK: Succs (1): B3
258// CHECK: [B5]
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000259// CHECK: 1: ~A() (Temporary object destructor)
Ted Kremenek58467202013-02-05 22:00:19 +0000260// CHECK: 2: foo
261// CHECK: 3: [B5.2] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(_Bool))
262// CHECK: 4: A() (CXXConstructExpr, class A)
263// CHECK: 5: [B5.4] (BindTemporary)
264// CHECK: 6: [B5.5].operator _Bool
265// CHECK: 7: [B5.6]()
266// CHECK: 8: [B5.7] (ImplicitCastExpr, UserDefinedConversion, _Bool)
267// CHECK: T: [B5.8] && ...
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000268// CHECK: Preds (2): B6 B7
Ted Kremenek3f635c02012-07-14 05:04:10 +0000269// CHECK: Succs (2): B4 B3
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000270// CHECK: [B6]
271// CHECK: 1: ~B() (Temporary object destructor)
272// CHECK: Preds (1): B7
Ted Kremenek3f635c02012-07-14 05:04:10 +0000273// CHECK: Succs (1): B5
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000274// CHECK: [B7]
Ted Kremenek3f635c02012-07-14 05:04:10 +0000275// CHECK: 1: [B9.5] && [B8.5]
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000276// CHECK: 2: bool a = A().operator _Bool() && B().operator _Bool();
Ted Kremenek3f635c02012-07-14 05:04:10 +0000277// CHECK: T: [B9.5] && ...
278// CHECK: Preds (2): B8 B9
279// CHECK: Succs (2): B6 B5
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000280// CHECK: [B8]
Ted Kremenek3f635c02012-07-14 05:04:10 +0000281// CHECK: 1: B() (CXXConstructExpr, class B)
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000282// CHECK: 2: [B8.1] (BindTemporary)
283// CHECK: 3: [B8.2].operator _Bool
284// CHECK: 4: [B8.3]()
285// CHECK: 5: [B8.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
Ted Kremenek3f635c02012-07-14 05:04:10 +0000286// CHECK: Preds (1): B9
287// CHECK: Succs (1): B7
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000288// CHECK: [B9]
Ted Kremenek3f635c02012-07-14 05:04:10 +0000289// CHECK: 1: A() (CXXConstructExpr, class A)
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000290// CHECK: 2: [B9.1] (BindTemporary)
291// CHECK: 3: [B9.2].operator _Bool
292// CHECK: 4: [B9.3]()
293// CHECK: 5: [B9.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
Ted Kremenek3f635c02012-07-14 05:04:10 +0000294// CHECK: T: [B9.5] && ...
295// CHECK: Preds (1): B10
296// CHECK: Succs (2): B8 B7
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000297// CHECK: [B0 (EXIT)]
298// CHECK: Preds (1): B1
299// CHECK: [B10 (ENTRY)]
Ted Kremenek3f635c02012-07-14 05:04:10 +0000300// CHECK: Succs (1): B9
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000301// CHECK: [B1]
302// CHECK: 1: ~A() (Temporary object destructor)
303// CHECK: 2: int b;
304// CHECK: Preds (2): B2 B3
305// CHECK: Succs (1): B0
306// CHECK: [B2]
307// CHECK: 1: ~B() (Temporary object destructor)
308// CHECK: Preds (1): B3
309// CHECK: Succs (1): B1
310// CHECK: [B3]
Ted Kremenek58467202013-02-05 22:00:19 +0000311// CHECK: 1: [B5.8] || [B4.5]
312// CHECK: 2: [B5.3]([B3.1])
313// CHECK: T: [B5.8] || ...
Ted Kremenek3f635c02012-07-14 05:04:10 +0000314// CHECK: Preds (2): B4 B5
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000315// CHECK: Succs (2): B1 B2
316// CHECK: [B4]
Ted Kremenek3f635c02012-07-14 05:04:10 +0000317// CHECK: 1: B() (CXXConstructExpr, class B)
318// CHECK: 2: [B4.1] (BindTemporary)
319// CHECK: 3: [B4.2].operator _Bool
320// CHECK: 4: [B4.3]()
321// CHECK: 5: [B4.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
322// CHECK: Preds (1): B5
323// CHECK: Succs (1): B3
324// CHECK: [B5]
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000325// CHECK: 1: ~A() (Temporary object destructor)
Ted Kremenek58467202013-02-05 22:00:19 +0000326// CHECK: 2: foo
327// CHECK: 3: [B5.2] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(_Bool))
328// CHECK: 4: A() (CXXConstructExpr, class A)
329// CHECK: 5: [B5.4] (BindTemporary)
330// CHECK: 6: [B5.5].operator _Bool
331// CHECK: 7: [B5.6]()
332// CHECK: 8: [B5.7] (ImplicitCastExpr, UserDefinedConversion, _Bool)
333// CHECK: T: [B5.8] || ...
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000334// CHECK: Preds (2): B6 B7
Ted Kremenek3f635c02012-07-14 05:04:10 +0000335// CHECK: Succs (2): B3 B4
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000336// CHECK: [B6]
337// CHECK: 1: ~B() (Temporary object destructor)
338// CHECK: Preds (1): B7
Ted Kremenek3f635c02012-07-14 05:04:10 +0000339// CHECK: Succs (1): B5
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000340// CHECK: [B7]
Ted Kremenek3f635c02012-07-14 05:04:10 +0000341// CHECK: 1: [B9.5] || [B8.5]
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000342// CHECK: 2: bool a = A().operator _Bool() || B().operator _Bool();
Ted Kremenek3f635c02012-07-14 05:04:10 +0000343// CHECK: T: [B9.5] || ...
344// CHECK: Preds (2): B8 B9
345// CHECK: Succs (2): B5 B6
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000346// CHECK: [B8]
Ted Kremenek3f635c02012-07-14 05:04:10 +0000347// CHECK: 1: B() (CXXConstructExpr, class B)
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000348// CHECK: 2: [B8.1] (BindTemporary)
349// CHECK: 3: [B8.2].operator _Bool
350// CHECK: 4: [B8.3]()
351// CHECK: 5: [B8.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
Ted Kremenek3f635c02012-07-14 05:04:10 +0000352// CHECK: Preds (1): B9
353// CHECK: Succs (1): B7
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000354// CHECK: [B9]
Ted Kremenek3f635c02012-07-14 05:04:10 +0000355// CHECK: 1: A() (CXXConstructExpr, class A)
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000356// CHECK: 2: [B9.1] (BindTemporary)
357// CHECK: 3: [B9.2].operator _Bool
358// CHECK: 4: [B9.3]()
359// CHECK: 5: [B9.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
Ted Kremenek3f635c02012-07-14 05:04:10 +0000360// CHECK: T: [B9.5] || ...
361// CHECK: Preds (1): B10
362// CHECK: Succs (2): B7 B8
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000363// CHECK: [B0 (EXIT)]
364// CHECK: Preds (1): B1
365// CHECK: [B11 (ENTRY)]
366// CHECK: Succs (1): B10
367// CHECK: [B1]
368// CHECK: 1: int b;
369// CHECK: 2: [B7.5].~A() (Implicit destructor)
370// CHECK: Preds (2): B2 B3
371// CHECK: Succs (1): B0
372// CHECK: [B2]
Ted Kremenek58467202013-02-05 22:00:19 +0000373// CHECK: 1: foo
374// CHECK: 2: [B2.1] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(int))
375// CHECK: 3: 0
376// CHECK: 4: [B2.2]([B2.3])
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000377// CHECK: Preds (1): B4
378// CHECK: Succs (1): B1
379// CHECK: [B3]
Ted Kremenek58467202013-02-05 22:00:19 +0000380// CHECK: 1: foo
381// CHECK: 2: [B3.1] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(int))
382// CHECK: 3: 0
383// CHECK: 4: [B3.2]([B3.3])
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000384// CHECK: Preds (1): B4
385// CHECK: Succs (1): B1
386// CHECK: [B4]
387// CHECK: 1: ~B() (Temporary object destructor)
388// CHECK: 2: B() (CXXConstructExpr, class B)
389// CHECK: 3: [B4.2] (BindTemporary)
390// CHECK: 4: [B4.3].operator _Bool
391// CHECK: 5: [B4.4]()
392// CHECK: 6: [B4.5] (ImplicitCastExpr, UserDefinedConversion, _Bool)
393// CHECK: 7: ~B() (Temporary object destructor)
394// CHECK: T: if [B4.6]
395// CHECK: Preds (2): B5 B6
396// CHECK: Succs (2): B3 B2
397// CHECK: [B5]
398// CHECK: 1: ~A() (Temporary object destructor)
399// CHECK: 2: ~A() (Temporary object destructor)
400// CHECK: Preds (1): B7
401// CHECK: Succs (1): B4
402// CHECK: [B6]
403// CHECK: 1: ~A() (Temporary object destructor)
404// CHECK: 2: ~A() (Temporary object destructor)
405// CHECK: 3: ~A() (Temporary object destructor)
406// CHECK: 4: ~B() (Temporary object destructor)
407// CHECK: Preds (1): B7
408// CHECK: Succs (1): B4
409// CHECK: [B7]
410// CHECK: 1: [B10.5] ? [B8.6] : [B9.15]
411// CHECK: 2: [B7.1] (ImplicitCastExpr, NoOp, const class A)
412// CHECK: 3: [B7.2]
413// CHECK: 4: [B7.3] (CXXConstructExpr, class A)
414// CHECK: 5: A a = B().operator _Bool() ? A() : A(B().operator A());
415// CHECK: T: [B10.5] ? ... : ...
416// CHECK: Preds (2): B8 B9
417// CHECK: Succs (2): B5 B6
418// CHECK: [B8]
419// CHECK: 1: A() (CXXConstructExpr, class A)
420// CHECK: 2: [B8.1] (BindTemporary)
421// CHECK: 3: [B8.2] (ImplicitCastExpr, NoOp, const class A)
422// CHECK: 4: [B8.3]
423// CHECK: 5: [B8.4] (CXXConstructExpr, class A)
424// CHECK: 6: [B8.5] (BindTemporary)
425// CHECK: Preds (1): B10
426// CHECK: Succs (1): B7
427// CHECK: [B9]
428// CHECK: 1: B() (CXXConstructExpr, class B)
429// CHECK: 2: [B9.1] (BindTemporary)
430// CHECK: 3: [B9.2].operator A
431// CHECK: 4: [B9.3]()
432// CHECK: 5: [B9.4] (ImplicitCastExpr, UserDefinedConversion, class A)
433// CHECK: 6: [B9.5] (BindTemporary)
434// CHECK: 7: [B9.6] (ImplicitCastExpr, NoOp, const class A)
435// CHECK: 8: [B9.7]
436// CHECK: 9: [B9.8] (CXXConstructExpr, class A)
437// CHECK: 10: [B9.9] (BindTemporary)
438// CHECK: 11: A([B9.10]) (CXXFunctionalCastExpr, ConstructorConversion, class A)
439// CHECK: 12: [B9.11] (ImplicitCastExpr, NoOp, const class A)
440// CHECK: 13: [B9.12]
441// CHECK: 14: [B9.13] (CXXConstructExpr, class A)
442// CHECK: 15: [B9.14] (BindTemporary)
443// CHECK: Preds (1): B10
444// CHECK: Succs (1): B7
445// CHECK: [B10]
446// CHECK: 1: B() (CXXConstructExpr, class B)
447// CHECK: 2: [B10.1] (BindTemporary)
448// CHECK: 3: [B10.2].operator _Bool
449// CHECK: 4: [B10.3]()
450// CHECK: 5: [B10.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
451// CHECK: T: [B10.5] ? ... : ...
452// CHECK: Preds (1): B11
453// CHECK: Succs (2): B8 B9
454// CHECK: [B0 (EXIT)]
455// CHECK: Preds (1): B1
456// CHECK: [B14 (ENTRY)]
457// CHECK: Succs (1): B13
458// CHECK: [B1]
459// CHECK: 1: ~B() (Temporary object destructor)
460// CHECK: 2: int b;
461// CHECK: 3: [B10.4].~A() (Implicit destructor)
462// CHECK: Preds (2): B2 B3
463// CHECK: Succs (1): B0
464// CHECK: [B2]
465// CHECK: 1: ~A() (Temporary object destructor)
466// CHECK: 2: ~A() (Temporary object destructor)
467// CHECK: Preds (1): B4
468// CHECK: Succs (1): B1
469// CHECK: [B3]
470// CHECK: 1: ~A() (Temporary object destructor)
471// CHECK: 2: ~A() (Temporary object destructor)
472// CHECK: 3: ~A() (Temporary object destructor)
473// CHECK: 4: ~B() (Temporary object destructor)
474// CHECK: Preds (1): B4
475// CHECK: Succs (1): B1
476// CHECK: [B4]
Ted Kremenek58467202013-02-05 22:00:19 +0000477// CHECK: 1: [B7.8] ? [B5.6] : [B6.15]
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000478// CHECK: 2: [B4.1] (ImplicitCastExpr, NoOp, const class A)
479// CHECK: 3: [B4.2]
Ted Kremenek58467202013-02-05 22:00:19 +0000480// CHECK: 4: [B7.3]([B4.3])
481// CHECK: T: [B7.8] ? ... : ...
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000482// CHECK: Preds (2): B5 B6
483// CHECK: Succs (2): B2 B3
484// CHECK: [B5]
485// CHECK: 1: A() (CXXConstructExpr, class A)
486// CHECK: 2: [B5.1] (BindTemporary)
487// CHECK: 3: [B5.2] (ImplicitCastExpr, NoOp, const class A)
488// CHECK: 4: [B5.3]
489// CHECK: 5: [B5.4] (CXXConstructExpr, class A)
490// CHECK: 6: [B5.5] (BindTemporary)
491// CHECK: Preds (1): B7
492// CHECK: Succs (1): B4
493// CHECK: [B6]
494// CHECK: 1: B() (CXXConstructExpr, class B)
495// CHECK: 2: [B6.1] (BindTemporary)
496// CHECK: 3: [B6.2].operator A
497// CHECK: 4: [B6.3]()
498// CHECK: 5: [B6.4] (ImplicitCastExpr, UserDefinedConversion, class A)
499// CHECK: 6: [B6.5] (BindTemporary)
500// CHECK: 7: [B6.6] (ImplicitCastExpr, NoOp, const class A)
501// CHECK: 8: [B6.7]
502// CHECK: 9: [B6.8] (CXXConstructExpr, class A)
503// CHECK: 10: [B6.9] (BindTemporary)
504// CHECK: 11: A([B6.10]) (CXXFunctionalCastExpr, ConstructorConversion, class A)
505// CHECK: 12: [B6.11] (ImplicitCastExpr, NoOp, const class A)
506// CHECK: 13: [B6.12]
507// CHECK: 14: [B6.13] (CXXConstructExpr, class A)
508// CHECK: 15: [B6.14] (BindTemporary)
509// CHECK: Preds (1): B7
510// CHECK: Succs (1): B4
511// CHECK: [B7]
512// CHECK: 1: ~B() (Temporary object destructor)
Ted Kremenek58467202013-02-05 22:00:19 +0000513// CHECK: 2: foo
514// CHECK: 3: [B7.2] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(const class A &))
515// CHECK: 4: B() (CXXConstructExpr, class B)
516// CHECK: 5: [B7.4] (BindTemporary)
517// CHECK: 6: [B7.5].operator _Bool
518// CHECK: 7: [B7.6]()
519// CHECK: 8: [B7.7] (ImplicitCastExpr, UserDefinedConversion, _Bool)
520// CHECK: T: [B7.8] ? ... : ...
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000521// CHECK: Preds (2): B8 B9
522// CHECK: Succs (2): B5 B6
523// CHECK: [B8]
524// CHECK: 1: ~A() (Temporary object destructor)
525// CHECK: Preds (1): B10
526// CHECK: Succs (1): B7
527// CHECK: [B9]
528// CHECK: 1: ~A() (Temporary object destructor)
529// CHECK: 2: ~A() (Temporary object destructor)
530// CHECK: 3: ~B() (Temporary object destructor)
531// CHECK: Preds (1): B10
532// CHECK: Succs (1): B7
533// CHECK: [B10]
534// CHECK: 1: [B13.5] ? [B11.6] : [B12.15]
535// CHECK: 2: [B10.1] (ImplicitCastExpr, NoOp, const class A)
536// CHECK: 3: [B10.2]
537// CHECK: 4: const A &a = B().operator _Bool() ? A() : A(B().operator A());
538// CHECK: T: [B13.5] ? ... : ...
539// CHECK: Preds (2): B11 B12
540// CHECK: Succs (2): B8 B9
541// CHECK: [B11]
542// CHECK: 1: A() (CXXConstructExpr, class A)
543// CHECK: 2: [B11.1] (BindTemporary)
544// CHECK: 3: [B11.2] (ImplicitCastExpr, NoOp, const class A)
545// CHECK: 4: [B11.3]
546// CHECK: 5: [B11.4] (CXXConstructExpr, class A)
547// CHECK: 6: [B11.5] (BindTemporary)
548// CHECK: Preds (1): B13
549// CHECK: Succs (1): B10
550// CHECK: [B12]
551// CHECK: 1: B() (CXXConstructExpr, class B)
552// CHECK: 2: [B12.1] (BindTemporary)
553// CHECK: 3: [B12.2].operator A
554// CHECK: 4: [B12.3]()
555// CHECK: 5: [B12.4] (ImplicitCastExpr, UserDefinedConversion, class A)
556// CHECK: 6: [B12.5] (BindTemporary)
557// CHECK: 7: [B12.6] (ImplicitCastExpr, NoOp, const class A)
558// CHECK: 8: [B12.7]
559// CHECK: 9: [B12.8] (CXXConstructExpr, class A)
560// CHECK: 10: [B12.9] (BindTemporary)
561// CHECK: 11: A([B12.10]) (CXXFunctionalCastExpr, ConstructorConversion, class A)
562// CHECK: 12: [B12.11] (ImplicitCastExpr, NoOp, const class A)
563// CHECK: 13: [B12.12]
564// CHECK: 14: [B12.13] (CXXConstructExpr, class A)
565// CHECK: 15: [B12.14] (BindTemporary)
566// CHECK: Preds (1): B13
567// CHECK: Succs (1): B10
568// CHECK: [B13]
569// CHECK: 1: B() (CXXConstructExpr, class B)
570// CHECK: 2: [B13.1] (BindTemporary)
571// CHECK: 3: [B13.2].operator _Bool
572// CHECK: 4: [B13.3]()
573// CHECK: 5: [B13.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
574// CHECK: T: [B13.5] ? ... : ...
575// CHECK: Preds (1): B14
576// CHECK: Succs (2): B11 B12
577// CHECK: [B0 (EXIT)]
578// CHECK: Preds (1): B1
579// CHECK: [B8 (ENTRY)]
580// CHECK: Succs (1): B7
581// CHECK: [B1]
582// CHECK: 1: ~A() (Temporary object destructor)
583// CHECK: 2: int b;
584// CHECK: 3: [B4.5].~A() (Implicit destructor)
585// CHECK: Preds (2): B2 B3
586// CHECK: Succs (1): B0
587// CHECK: [B2]
588// CHECK: 1: ~A() (Temporary object destructor)
589// CHECK: Preds (1): B4
590// CHECK: Succs (1): B1
591// CHECK: [B3]
592// CHECK: 1: ~A() (Temporary object destructor)
593// CHECK: 2: ~A() (Temporary object destructor)
594// CHECK: Preds (1): B4
595// CHECK: Succs (1): B1
596// CHECK: [B4]
597// CHECK: 1: [B7.2] ?: [B6.6]
598// CHECK: 2: [B4.1] (ImplicitCastExpr, NoOp, const class A)
599// CHECK: 3: [B4.2]
600// CHECK: 4: [B4.3] (CXXConstructExpr, class A)
601// CHECK: 5: A a = A() ?: A();
602// CHECK: T: [B7.5] ? ... : ...
603// CHECK: Preds (2): B5 B6
604// CHECK: Succs (2): B2 B3
605// CHECK: [B5]
606// CHECK: 1: [B7.2] (ImplicitCastExpr, NoOp, const class A)
607// CHECK: 2: [B5.1]
608// CHECK: 3: [B5.2] (CXXConstructExpr, class A)
609// CHECK: 4: [B5.3] (BindTemporary)
610// CHECK: Preds (1): B7
611// CHECK: Succs (1): B4
612// CHECK: [B6]
613// CHECK: 1: A() (CXXConstructExpr, class A)
614// CHECK: 2: [B6.1] (BindTemporary)
615// CHECK: 3: [B6.2] (ImplicitCastExpr, NoOp, const class A)
616// CHECK: 4: [B6.3]
617// CHECK: 5: [B6.4] (CXXConstructExpr, class A)
618// CHECK: 6: [B6.5] (BindTemporary)
619// CHECK: Preds (1): B7
620// CHECK: Succs (1): B4
621// CHECK: [B7]
622// CHECK: 1: A() (CXXConstructExpr, class A)
623// CHECK: 2: [B7.1] (BindTemporary)
624// CHECK: 3: [B7.2].operator _Bool
625// CHECK: 4: [B7.3]()
626// CHECK: 5: [B7.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
627// CHECK: T: [B7.5] ? ... : ...
628// CHECK: Preds (1): B8
629// CHECK: Succs (2): B5 B6
630// CHECK: [B0 (EXIT)]
631// CHECK: Preds (1): B1
632// CHECK: [B13 (ENTRY)]
633// CHECK: Succs (1): B12
634// CHECK: [B1]
635// CHECK: 1: ~A() (Temporary object destructor)
636// CHECK: 2: int b;
637// CHECK: 3: [B9.4].~A() (Implicit destructor)
638// CHECK: Preds (2): B2 B3
639// CHECK: Succs (1): B0
640// CHECK: [B2]
641// CHECK: 1: ~A() (Temporary object destructor)
642// CHECK: Preds (1): B4
643// CHECK: Succs (1): B1
644// CHECK: [B3]
645// CHECK: 1: ~A() (Temporary object destructor)
646// CHECK: 2: ~A() (Temporary object destructor)
647// CHECK: Preds (1): B4
648// CHECK: Succs (1): B1
649// CHECK: [B4]
Ted Kremenek58467202013-02-05 22:00:19 +0000650// CHECK: 1: [B7.5] ?: [B6.6]
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000651// CHECK: 2: [B4.1] (ImplicitCastExpr, NoOp, const class A)
652// CHECK: 3: [B4.2]
Ted Kremenek58467202013-02-05 22:00:19 +0000653// CHECK: 4: [B7.3]([B4.3])
654// CHECK: T: [B7.8] ? ... : ...
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000655// CHECK: Preds (2): B5 B6
656// CHECK: Succs (2): B2 B3
657// CHECK: [B5]
Ted Kremenek58467202013-02-05 22:00:19 +0000658// CHECK: 1: [B7.5] (ImplicitCastExpr, NoOp, const class A)
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000659// CHECK: 2: [B5.1]
660// CHECK: 3: [B5.2] (CXXConstructExpr, class A)
661// CHECK: 4: [B5.3] (BindTemporary)
662// CHECK: Preds (1): B7
663// CHECK: Succs (1): B4
664// CHECK: [B6]
665// CHECK: 1: A() (CXXConstructExpr, class A)
666// CHECK: 2: [B6.1] (BindTemporary)
667// CHECK: 3: [B6.2] (ImplicitCastExpr, NoOp, const class A)
668// CHECK: 4: [B6.3]
669// CHECK: 5: [B6.4] (CXXConstructExpr, class A)
670// CHECK: 6: [B6.5] (BindTemporary)
671// CHECK: Preds (1): B7
672// CHECK: Succs (1): B4
673// CHECK: [B7]
674// CHECK: 1: ~A() (Temporary object destructor)
Ted Kremenek58467202013-02-05 22:00:19 +0000675// CHECK: 2: foo
676// CHECK: 3: [B7.2] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(const class A &))
677// CHECK: 4: A() (CXXConstructExpr, class A)
678// CHECK: 5: [B7.4] (BindTemporary)
679// CHECK: 6: [B7.5].operator _Bool
680// CHECK: 7: [B7.6]()
681// CHECK: 8: [B7.7] (ImplicitCastExpr, UserDefinedConversion, _Bool)
682// CHECK: T: [B7.8] ? ... : ...
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000683// CHECK: Preds (2): B9 B8
684// CHECK: Succs (2): B5 B6
685// CHECK: [B8]
686// CHECK: 1: ~A() (Temporary object destructor)
687// CHECK: Preds (1): B9
688// CHECK: Succs (1): B7
689// CHECK: [B9]
690// CHECK: 1: [B12.2] ?: [B11.6]
691// CHECK: 2: [B9.1] (ImplicitCastExpr, NoOp, const class A)
692// CHECK: 3: [B9.2]
693// CHECK: 4: const A &a = A() ?: A();
694// CHECK: T: [B12.5] ? ... : ...
695// CHECK: Preds (2): B10 B11
696// CHECK: Succs (2): B7 B8
697// CHECK: [B10]
698// CHECK: 1: [B12.2] (ImplicitCastExpr, NoOp, const class A)
699// CHECK: 2: [B10.1]
700// CHECK: 3: [B10.2] (CXXConstructExpr, class A)
701// CHECK: 4: [B10.3] (BindTemporary)
702// CHECK: Preds (1): B12
703// CHECK: Succs (1): B9
704// CHECK: [B11]
705// CHECK: 1: A() (CXXConstructExpr, class A)
706// CHECK: 2: [B11.1] (BindTemporary)
707// CHECK: 3: [B11.2] (ImplicitCastExpr, NoOp, const class A)
708// CHECK: 4: [B11.3]
709// CHECK: 5: [B11.4] (CXXConstructExpr, class A)
710// CHECK: 6: [B11.5] (BindTemporary)
711// CHECK: Preds (1): B12
712// CHECK: Succs (1): B9
713// CHECK: [B12]
714// CHECK: 1: A() (CXXConstructExpr, class A)
715// CHECK: 2: [B12.1] (BindTemporary)
716// CHECK: 3: [B12.2].operator _Bool
717// CHECK: 4: [B12.3]()
718// CHECK: 5: [B12.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
719// CHECK: T: [B12.5] ? ... : ...
720// CHECK: Preds (1): B13
721// CHECK: Succs (2): B10 B11
722// CHECK: [B0 (EXIT)]
723// CHECK: Preds (1): B1
724// CHECK: [B2 (ENTRY)]
725// CHECK: Succs (1): B1
726// CHECK: [B1]
727// CHECK: 1: A() (CXXConstructExpr, class A)
728// CHECK: 2: [B1.1] (BindTemporary)
729// CHECK: 3: [B1.2] (ImplicitCastExpr, NoOp, const class A)
730// CHECK: 4: [B1.3]
731// CHECK: 5: [B1.4] (CXXConstructExpr, class A)
732// CHECK: 6: A a = A();
733// CHECK: 7: ~A() (Temporary object destructor)
734// CHECK: 8: int b;
735// CHECK: 9: [B1.6].~A() (Implicit destructor)
736// CHECK: Preds (1): B2
737// CHECK: Succs (1): B0
738// CHECK: [B0 (EXIT)]
739// CHECK: Preds (1): B1
740// CHECK: [B2 (ENTRY)]
741// CHECK: Succs (1): B1
742// CHECK: [B1]
743// CHECK: 1: A() (CXXConstructExpr, class A)
744// CHECK: 2: [B1.1] (BindTemporary)
745// CHECK: 3: [B1.2] (ImplicitCastExpr, NoOp, const class A)
746// CHECK: 4: [B1.3]
747// CHECK: 5: const A &a = A();
Ted Kremenek58467202013-02-05 22:00:19 +0000748// CHECK: 6: foo
749// CHECK: 7: [B1.6] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(const class A &))
750// CHECK: 8: A() (CXXConstructExpr, class A)
751// CHECK: 9: [B1.8] (BindTemporary)
752// CHECK: 10: [B1.9] (ImplicitCastExpr, NoOp, const class A)
753// CHECK: 11: [B1.10]
754// CHECK: 12: [B1.7]([B1.11])
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000755// CHECK: 13: ~A() (Temporary object destructor)
756// CHECK: 14: int b;
757// CHECK: 15: [B1.5].~A() (Implicit destructor)
758// CHECK: Preds (1): B2
759// CHECK: Succs (1): B0
760// CHECK: [B0 (EXIT)]
761// CHECK: Preds (1): B1
762// CHECK: [B2 (ENTRY)]
763// CHECK: Succs (1): B1
764// CHECK: [B1]
765// CHECK: 1: A::make
766// CHECK: 2: [B1.1] (ImplicitCastExpr, FunctionToPointerDecay, class A (*)(void))
767// CHECK: 3: [B1.2]()
768// CHECK: 4: [B1.3] (BindTemporary)
769// CHECK: 5: [B1.4] (ImplicitCastExpr, NoOp, const class A)
770// CHECK: 6: [B1.5]
771// CHECK: 7: [B1.6] (CXXConstructExpr, class A)
772// CHECK: 8: A a = A::make();
773// CHECK: 9: ~A() (Temporary object destructor)
774// CHECK: 10: int b;
775// CHECK: 11: [B1.8].~A() (Implicit destructor)
776// CHECK: Preds (1): B2
777// CHECK: Succs (1): B0
778// CHECK: [B0 (EXIT)]
779// CHECK: Preds (1): B1
780// CHECK: [B2 (ENTRY)]
781// CHECK: Succs (1): B1
782// CHECK: [B1]
783// CHECK: 1: A::make
784// CHECK: 2: [B1.1] (ImplicitCastExpr, FunctionToPointerDecay, class A (*)(void))
785// CHECK: 3: [B1.2]()
786// CHECK: 4: [B1.3] (BindTemporary)
787// CHECK: 5: [B1.4] (ImplicitCastExpr, NoOp, const class A)
788// CHECK: 6: [B1.5]
789// CHECK: 7: const A &a = A::make();
Ted Kremenek58467202013-02-05 22:00:19 +0000790// CHECK: 8: foo
791// CHECK: 9: [B1.8] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(const class A &))
792// CHECK: 10: A::make
793// CHECK: 11: [B1.10] (ImplicitCastExpr, FunctionToPointerDecay, class A (*)(void))
794// CHECK: 12: [B1.11]()
795// CHECK: 13: [B1.12] (BindTemporary)
796// CHECK: 14: [B1.13] (ImplicitCastExpr, NoOp, const class A)
797// CHECK: 15: [B1.14]
798// CHECK: 16: [B1.9]([B1.15])
Zhongxing Xu97a72c32012-01-11 02:39:07 +0000799// CHECK: 17: ~A() (Temporary object destructor)
800// CHECK: 18: int b;
801// CHECK: 19: [B1.7].~A() (Implicit destructor)
802// CHECK: Preds (1): B2
803// CHECK: Succs (1): B0
804// CHECK: [B0 (EXIT)]
805// CHECK: Preds (1): B1
806// CHECK: [B2 (ENTRY)]
807// CHECK: Succs (1): B1
808// CHECK: [B1]
809// CHECK: 1: int a;
810// CHECK: 2: A() (CXXConstructExpr, class A)
811// CHECK: 3: [B1.2] (BindTemporary)
812// CHECK: 4: [B1.3].operator int
813// CHECK: 5: [B1.4]()
814// CHECK: 6: [B1.5] (ImplicitCastExpr, UserDefinedConversion, int)
815// CHECK: 7: a
816// CHECK: 8: [B1.7] = [B1.6]
817// CHECK: 9: ~A() (Temporary object destructor)
818// CHECK: 10: int b;
819// CHECK: Preds (1): B2
820// CHECK: Succs (1): B0
821// CHECK: [B0 (EXIT)]
822// CHECK: Preds (1): B1
823// CHECK: [B2 (ENTRY)]
824// CHECK: Succs (1): B1
825// CHECK: [B1]
826// CHECK: 1: A() (CXXConstructExpr, class A)
827// CHECK: 2: [B1.1] (BindTemporary)
828// CHECK: 3: [B1.2].operator int
829// CHECK: 4: [B1.3]()
830// CHECK: 5: [B1.4] (ImplicitCastExpr, UserDefinedConversion, int)
831// CHECK: 6: int([B1.5]) (CXXFunctionalCastExpr, NoOp, int)
832// CHECK: 7: B() (CXXConstructExpr, class B)
833// CHECK: 8: [B1.7] (BindTemporary)
834// CHECK: 9: [B1.8].operator int
835// CHECK: 10: [B1.9]()
836// CHECK: 11: [B1.10] (ImplicitCastExpr, UserDefinedConversion, int)
837// CHECK: 12: int([B1.11]) (CXXFunctionalCastExpr, NoOp, int)
838// CHECK: 13: [B1.6] + [B1.12]
839// CHECK: 14: a([B1.13]) (Member initializer)
840// CHECK: 15: ~B() (Temporary object destructor)
841// CHECK: 16: ~A() (Temporary object destructor)
842// CHECK: 17: /*implicit*/int()
843// CHECK: 18: b([B1.17]) (Member initializer)
844// CHECK: Preds (1): B2
845// CHECK: Succs (1): B0
846// CHECK: [B0 (EXIT)]
847// CHECK: Preds (1): B1
Ted Kremenek381c0662011-11-30 22:08:08 +0000848