1*67e74705SXin Li // RUN: rm -f %t
2*67e74705SXin Li // RUN: %clang_cc1 -analyze -analyzer-checker=debug.DumpCFG -analyzer-config cfg-temporary-dtors=true -std=c++98 %s > %t 2>&1
3*67e74705SXin Li // RUN: FileCheck --input-file=%t -check-prefix=CXX98 -check-prefix=CHECK %s
4*67e74705SXin Li // RUN: %clang_cc1 -analyze -analyzer-checker=debug.DumpCFG -analyzer-config cfg-temporary-dtors=true -std=c++11 %s > %t 2>&1
5*67e74705SXin Li // RUN: FileCheck --input-file=%t -check-prefix=CXX11 -check-prefix=CHECK %s
6*67e74705SXin Li
7*67e74705SXin Li class A {
8*67e74705SXin Li public:
A()9*67e74705SXin Li A() {}
~A()10*67e74705SXin Li ~A() {}
11*67e74705SXin Li
make()12*67e74705SXin Li static A make() { return A(); }
13*67e74705SXin Li
operator bool()14*67e74705SXin Li operator bool() { return false; }
operator int()15*67e74705SXin Li operator int() { return 0; }
16*67e74705SXin Li };
17*67e74705SXin Li
18*67e74705SXin Li class B {
19*67e74705SXin Li public:
B()20*67e74705SXin Li B() {}
~B()21*67e74705SXin Li ~B() {}
22*67e74705SXin Li
operator bool()23*67e74705SXin Li operator bool() { return true; }
operator int()24*67e74705SXin Li operator int() { return 1; }
operator A()25*67e74705SXin Li operator A() { return A(); }
26*67e74705SXin Li };
27*67e74705SXin Li
28*67e74705SXin Li void foo(int);
29*67e74705SXin Li void foo(bool);
30*67e74705SXin Li void foo(const A&);
31*67e74705SXin Li
test_binary()32*67e74705SXin Li void test_binary() {
33*67e74705SXin Li int a = int(A()) + int(B());
34*67e74705SXin Li foo(int(A()) + int(B()));
35*67e74705SXin Li int b;
36*67e74705SXin Li }
37*67e74705SXin Li
test_and()38*67e74705SXin Li void test_and() {
39*67e74705SXin Li bool a = A() && B();
40*67e74705SXin Li foo(A() && B());
41*67e74705SXin Li int b;
42*67e74705SXin Li }
43*67e74705SXin Li
test_or()44*67e74705SXin Li void test_or() {
45*67e74705SXin Li bool a = A() || B();
46*67e74705SXin Li foo(A() || B());
47*67e74705SXin Li int b;
48*67e74705SXin Li }
49*67e74705SXin Li
test_cond()50*67e74705SXin Li void test_cond() {
51*67e74705SXin Li A a = B() ? A() : A(B());
52*67e74705SXin Li if (B()) { foo(0); } else { foo(0); }
53*67e74705SXin Li int b;
54*67e74705SXin Li }
55*67e74705SXin Li
56*67e74705SXin Li struct C {
CC57*67e74705SXin Li C():b_(true) {}
~CC58*67e74705SXin Li ~C() {}
59*67e74705SXin Li
operator boolC60*67e74705SXin Li operator bool() { return b_; }
61*67e74705SXin Li bool b_;
62*67e74705SXin Li };
63*67e74705SXin Li
64*67e74705SXin Li struct D {
DD65*67e74705SXin Li D():b_(true) {}
66*67e74705SXin Li
operator boolD67*67e74705SXin Li operator bool() { return b_; }
68*67e74705SXin Li bool b_;
69*67e74705SXin Li };
70*67e74705SXin Li
test_cond_unnamed_custom_destructor()71*67e74705SXin Li int test_cond_unnamed_custom_destructor() {
72*67e74705SXin Li if (C()) { return 1; } else { return 0; }
73*67e74705SXin Li }
74*67e74705SXin Li
test_cond_named_custom_destructor()75*67e74705SXin Li int test_cond_named_custom_destructor() {
76*67e74705SXin Li if (C c = C()) { return 1; } else { return 0; }
77*67e74705SXin Li }
78*67e74705SXin Li
test_cond_unnamed_auto_destructor()79*67e74705SXin Li int test_cond_unnamed_auto_destructor() {
80*67e74705SXin Li if (D()) { return 1; } else { return 0; }
81*67e74705SXin Li }
82*67e74705SXin Li
test_cond_named_auto_destructor()83*67e74705SXin Li int test_cond_named_auto_destructor() {
84*67e74705SXin Li if (D d = D()) { return 1; } else { return 0; }
85*67e74705SXin Li }
86*67e74705SXin Li
test_cond_cref()87*67e74705SXin Li void test_cond_cref() {
88*67e74705SXin Li const A& a = B() ? A() : A(B());
89*67e74705SXin Li foo(B() ? A() : A(B()));
90*67e74705SXin Li int b;
91*67e74705SXin Li }
92*67e74705SXin Li
test_cond_implicit()93*67e74705SXin Li void test_cond_implicit() {
94*67e74705SXin Li A a = A() ?: A();
95*67e74705SXin Li int b;
96*67e74705SXin Li }
97*67e74705SXin Li
test_cond_implicit_cref()98*67e74705SXin Li void test_cond_implicit_cref() {
99*67e74705SXin Li const A& a = A() ?: A();
100*67e74705SXin Li foo(A() ?: A());
101*67e74705SXin Li int b;
102*67e74705SXin Li }
103*67e74705SXin Li
test_copy_init()104*67e74705SXin Li void test_copy_init() {
105*67e74705SXin Li A a = A();
106*67e74705SXin Li int b;
107*67e74705SXin Li }
108*67e74705SXin Li
test_cref_init()109*67e74705SXin Li void test_cref_init() {
110*67e74705SXin Li const A& a = A();
111*67e74705SXin Li foo(A());
112*67e74705SXin Li int b;
113*67e74705SXin Li }
114*67e74705SXin Li
test_call_copy_init()115*67e74705SXin Li void test_call_copy_init() {
116*67e74705SXin Li A a = A::make();
117*67e74705SXin Li int b;
118*67e74705SXin Li }
119*67e74705SXin Li
test_call_cref_init()120*67e74705SXin Li void test_call_cref_init() {
121*67e74705SXin Li const A& a = A::make();
122*67e74705SXin Li foo(A::make());
123*67e74705SXin Li int b;
124*67e74705SXin Li }
125*67e74705SXin Li
test_assign()126*67e74705SXin Li void test_assign() {
127*67e74705SXin Li int a;
128*67e74705SXin Li a = A();
129*67e74705SXin Li int b;
130*67e74705SXin Li }
131*67e74705SXin Li
132*67e74705SXin Li class TestCtorInits {
133*67e74705SXin Li int a;
134*67e74705SXin Li int b;
135*67e74705SXin Li public:
136*67e74705SXin Li TestCtorInits();
137*67e74705SXin Li };
138*67e74705SXin Li
TestCtorInits()139*67e74705SXin Li TestCtorInits::TestCtorInits()
140*67e74705SXin Li : a(int(A()) + int(B()))
141*67e74705SXin Li , b() {}
142*67e74705SXin Li
143*67e74705SXin Li class NoReturn {
144*67e74705SXin Li public:
145*67e74705SXin Li ~NoReturn() __attribute__((noreturn));
146*67e74705SXin Li void f();
147*67e74705SXin Li };
148*67e74705SXin Li
test_noreturn1()149*67e74705SXin Li void test_noreturn1() {
150*67e74705SXin Li int a;
151*67e74705SXin Li NoReturn().f();
152*67e74705SXin Li int b;
153*67e74705SXin Li }
154*67e74705SXin Li
test_noreturn2()155*67e74705SXin Li void test_noreturn2() {
156*67e74705SXin Li int a;
157*67e74705SXin Li NoReturn(), 47;
158*67e74705SXin Li int b;
159*67e74705SXin Li }
160*67e74705SXin Li
161*67e74705SXin Li extern bool check(const NoReturn&);
162*67e74705SXin Li
163*67e74705SXin Li // PR16664 and PR18159
testConsistencyNestedSimple(bool value)164*67e74705SXin Li int testConsistencyNestedSimple(bool value) {
165*67e74705SXin Li if (value) {
166*67e74705SXin Li if (!value || check(NoReturn())) {
167*67e74705SXin Li return 1;
168*67e74705SXin Li }
169*67e74705SXin Li }
170*67e74705SXin Li return 0;
171*67e74705SXin Li }
172*67e74705SXin Li
173*67e74705SXin Li // PR16664 and PR18159
testConsistencyNestedComplex(bool value)174*67e74705SXin Li int testConsistencyNestedComplex(bool value) {
175*67e74705SXin Li if (value) {
176*67e74705SXin Li if (!value || !value || check(NoReturn())) {
177*67e74705SXin Li return 1;
178*67e74705SXin Li }
179*67e74705SXin Li }
180*67e74705SXin Li return 0;
181*67e74705SXin Li }
182*67e74705SXin Li
183*67e74705SXin Li // PR16664 and PR18159
testConsistencyNestedNormalReturn(bool value)184*67e74705SXin Li int testConsistencyNestedNormalReturn(bool value) {
185*67e74705SXin Li if (value) {
186*67e74705SXin Li if (!value || value || check(NoReturn())) {
187*67e74705SXin Li return 1;
188*67e74705SXin Li }
189*67e74705SXin Li }
190*67e74705SXin Li return 0;
191*67e74705SXin Li }
192*67e74705SXin Li
193*67e74705SXin Li // CHECK: [B1 (ENTRY)]
194*67e74705SXin Li // CHECK: Succs (1): B0
195*67e74705SXin Li // CHECK: [B0 (EXIT)]
196*67e74705SXin Li // CHECK: Preds (1): B1
197*67e74705SXin Li // CHECK: [B1 (ENTRY)]
198*67e74705SXin Li // CHECK: Succs (1): B0
199*67e74705SXin Li // CHECK: [B0 (EXIT)]
200*67e74705SXin Li // CHECK: Preds (1): B1
201*67e74705SXin Li // CHECK: [B2 (ENTRY)]
202*67e74705SXin Li // CHECK: Succs (1): B1
203*67e74705SXin Li // CHECK: [B1]
204*67e74705SXin Li // CHECK: 1: A() (CXXConstructExpr, class A)
205*67e74705SXin Li // CHECK: 2: [B1.1] (BindTemporary)
206*67e74705SXin Li // CHECK: 3: [B1.2] (ImplicitCastExpr, NoOp, const class A)
207*67e74705SXin Li // CHECK: 4: [B1.3]
208*67e74705SXin Li // CHECK: 5: [B1.4] (CXXConstructExpr, class A)
209*67e74705SXin Li // CHECK: 6: ~A() (Temporary object destructor)
210*67e74705SXin Li // CHECK: 7: return [B1.5];
211*67e74705SXin Li // CHECK: Preds (1): B2
212*67e74705SXin Li // CHECK: Succs (1): B0
213*67e74705SXin Li // CHECK: [B0 (EXIT)]
214*67e74705SXin Li // CHECK: Preds (1): B1
215*67e74705SXin Li // CHECK: [B2 (ENTRY)]
216*67e74705SXin Li // CHECK: Succs (1): B1
217*67e74705SXin Li // CHECK: [B1]
218*67e74705SXin Li // CHECK: 1: false
219*67e74705SXin Li // CHECK: 2: return [B1.1];
220*67e74705SXin Li // CHECK: Preds (1): B2
221*67e74705SXin Li // CHECK: Succs (1): B0
222*67e74705SXin Li // CHECK: [B0 (EXIT)]
223*67e74705SXin Li // CHECK: Preds (1): B1
224*67e74705SXin Li // CHECK: [B2 (ENTRY)]
225*67e74705SXin Li // CHECK: Succs (1): B1
226*67e74705SXin Li // CHECK: [B1]
227*67e74705SXin Li // CHECK: 1: 0
228*67e74705SXin Li // CHECK: 2: return [B1.1];
229*67e74705SXin Li // CHECK: Preds (1): B2
230*67e74705SXin Li // CHECK: Succs (1): B0
231*67e74705SXin Li // CHECK: [B0 (EXIT)]
232*67e74705SXin Li // CHECK: Preds (1): B1
233*67e74705SXin Li // CHECK: [B1 (ENTRY)]
234*67e74705SXin Li // CHECK: Succs (1): B0
235*67e74705SXin Li // CHECK: [B0 (EXIT)]
236*67e74705SXin Li // CHECK: Preds (1): B1
237*67e74705SXin Li // CHECK: [B1 (ENTRY)]
238*67e74705SXin Li // CHECK: Succs (1): B0
239*67e74705SXin Li // CHECK: [B0 (EXIT)]
240*67e74705SXin Li // CHECK: Preds (1): B1
241*67e74705SXin Li // CHECK: [B2 (ENTRY)]
242*67e74705SXin Li // CHECK: Succs (1): B1
243*67e74705SXin Li // CHECK: [B1]
244*67e74705SXin Li // CHECK: 1: true
245*67e74705SXin Li // CHECK: 2: return [B1.1];
246*67e74705SXin Li // CHECK: Preds (1): B2
247*67e74705SXin Li // CHECK: Succs (1): B0
248*67e74705SXin Li // CHECK: [B0 (EXIT)]
249*67e74705SXin Li // CHECK: Preds (1): B1
250*67e74705SXin Li // CHECK: [B2 (ENTRY)]
251*67e74705SXin Li // CHECK: Succs (1): B1
252*67e74705SXin Li // CHECK: [B1]
253*67e74705SXin Li // CHECK: 1: 1
254*67e74705SXin Li // CHECK: 2: return [B1.1];
255*67e74705SXin Li // CHECK: Preds (1): B2
256*67e74705SXin Li // CHECK: Succs (1): B0
257*67e74705SXin Li // CHECK: [B0 (EXIT)]
258*67e74705SXin Li // CHECK: Preds (1): B1
259*67e74705SXin Li // CHECK: [B2 (ENTRY)]
260*67e74705SXin Li // CHECK: Succs (1): B1
261*67e74705SXin Li // CHECK: [B1]
262*67e74705SXin Li // CHECK: 1: A() (CXXConstructExpr, class A)
263*67e74705SXin Li // CHECK: 2: [B1.1] (BindTemporary)
264*67e74705SXin Li // CHECK: 3: [B1.2] (ImplicitCastExpr, NoOp, const class A)
265*67e74705SXin Li // CHECK: 4: [B1.3]
266*67e74705SXin Li // CHECK: 5: [B1.4] (CXXConstructExpr, class A)
267*67e74705SXin Li // CHECK: 6: ~A() (Temporary object destructor)
268*67e74705SXin Li // CHECK: 7: return [B1.5];
269*67e74705SXin Li // CHECK: Preds (1): B2
270*67e74705SXin Li // CHECK: Succs (1): B0
271*67e74705SXin Li // CHECK: [B0 (EXIT)]
272*67e74705SXin Li // CHECK: Preds (1): B1
273*67e74705SXin Li // CHECK: [B2 (ENTRY)]
274*67e74705SXin Li // CHECK: Succs (1): B1
275*67e74705SXin Li // CHECK: [B1]
276*67e74705SXin Li // CHECK: 1: A() (CXXConstructExpr, class A)
277*67e74705SXin Li // CHECK: 2: [B1.1] (BindTemporary)
278*67e74705SXin Li // CHECK: 3: [B1.2].operator int
279*67e74705SXin Li // CHECK: 4: [B1.2]
280*67e74705SXin Li // CHECK: 5: [B1.4] (ImplicitCastExpr, UserDefinedConversion, int)
281*67e74705SXin Li // CHECK: 6: int([B1.5]) (CXXFunctionalCastExpr, NoOp, int)
282*67e74705SXin Li // CHECK: 7: B() (CXXConstructExpr, class B)
283*67e74705SXin Li // CHECK: 8: [B1.7] (BindTemporary)
284*67e74705SXin Li // CHECK: 9: [B1.8].operator int
285*67e74705SXin Li // CHECK: 10: [B1.8]
286*67e74705SXin Li // CHECK: 11: [B1.10] (ImplicitCastExpr, UserDefinedConversion, int)
287*67e74705SXin Li // CHECK: 12: int([B1.11]) (CXXFunctionalCastExpr, NoOp, int)
288*67e74705SXin Li // CHECK: 13: [B1.6] + [B1.12]
289*67e74705SXin Li // CHECK: 14: int a = int(A()) + int(B());
290*67e74705SXin Li // CHECK: 15: ~B() (Temporary object destructor)
291*67e74705SXin Li // CHECK: 16: ~A() (Temporary object destructor)
292*67e74705SXin Li // CHECK: 17: foo
293*67e74705SXin Li // CHECK: 18: [B1.17] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(int))
294*67e74705SXin Li // CHECK: 19: A() (CXXConstructExpr, class A)
295*67e74705SXin Li // CHECK: 20: [B1.19] (BindTemporary)
296*67e74705SXin Li // CHECK: 21: [B1.20].operator int
297*67e74705SXin Li // CHECK: 22: [B1.20]
298*67e74705SXin Li // CHECK: 23: [B1.22] (ImplicitCastExpr, UserDefinedConversion, int)
299*67e74705SXin Li // CHECK: 24: int([B1.23]) (CXXFunctionalCastExpr, NoOp, int)
300*67e74705SXin Li // CHECK: 25: B() (CXXConstructExpr, class B)
301*67e74705SXin Li // CHECK: 26: [B1.25] (BindTemporary)
302*67e74705SXin Li // CHECK: 27: [B1.26].operator int
303*67e74705SXin Li // CHECK: 28: [B1.26]
304*67e74705SXin Li // CHECK: 29: [B1.28] (ImplicitCastExpr, UserDefinedConversion, int)
305*67e74705SXin Li // CHECK: 30: int([B1.29]) (CXXFunctionalCastExpr, NoOp, int)
306*67e74705SXin Li // CHECK: 31: [B1.24] + [B1.30]
307*67e74705SXin Li // CHECK: 32: [B1.18]([B1.31])
308*67e74705SXin Li // CHECK: 33: ~B() (Temporary object destructor)
309*67e74705SXin Li // CHECK: 34: ~A() (Temporary object destructor)
310*67e74705SXin Li // CHECK: 35: int b;
311*67e74705SXin Li // CHECK: Preds (1): B2
312*67e74705SXin Li // CHECK: Succs (1): B0
313*67e74705SXin Li // CHECK: [B0 (EXIT)]
314*67e74705SXin Li // CHECK: Preds (1): B1
315*67e74705SXin Li // CHECK: [B10 (ENTRY)]
316*67e74705SXin Li // CHECK: Succs (1): B9
317*67e74705SXin Li // CHECK: [B1]
318*67e74705SXin Li // CHECK: 1: ~A() (Temporary object destructor)
319*67e74705SXin Li // CHECK: 2: int b;
320*67e74705SXin Li // CHECK: Preds (2): B2 B3
321*67e74705SXin Li // CHECK: Succs (1): B0
322*67e74705SXin Li // CHECK: [B2]
323*67e74705SXin Li // CHECK: 1: ~B() (Temporary object destructor)
324*67e74705SXin Li // CHECK: Preds (1): B3
325*67e74705SXin Li // CHECK: Succs (1): B1
326*67e74705SXin Li // CHECK: [B3]
327*67e74705SXin Li // CHECK: 1: [B5.8] && [B4.5]
328*67e74705SXin Li // CHECK: 2: [B5.3]([B3.1])
329*67e74705SXin Li // CHECK: T: (Temp Dtor) [B4.2]
330*67e74705SXin Li // CHECK: Preds (2): B4 B5
331*67e74705SXin Li // CHECK: Succs (2): B2 B1
332*67e74705SXin Li // CHECK: [B4]
333*67e74705SXin Li // CHECK: 1: B() (CXXConstructExpr, class B)
334*67e74705SXin Li // CHECK: 2: [B4.1] (BindTemporary)
335*67e74705SXin Li // CHECK: 3: [B4.2].operator bool
336*67e74705SXin Li // CHECK: 4: [B4.2]
337*67e74705SXin Li // CHECK: 5: [B4.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
338*67e74705SXin Li // CHECK: Preds (1): B5
339*67e74705SXin Li // CHECK: Succs (1): B3
340*67e74705SXin Li // CHECK: [B5]
341*67e74705SXin Li // CHECK: 1: ~A() (Temporary object destructor)
342*67e74705SXin Li // CHECK: 2: foo
343*67e74705SXin Li // CHECK: 3: [B5.2] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(_Bool))
344*67e74705SXin Li // CHECK: 4: A() (CXXConstructExpr, class A)
345*67e74705SXin Li // CHECK: 5: [B5.4] (BindTemporary)
346*67e74705SXin Li // CHECK: 6: [B5.5].operator bool
347*67e74705SXin Li // CHECK: 7: [B5.5]
348*67e74705SXin Li // CHECK: 8: [B5.7] (ImplicitCastExpr, UserDefinedConversion, _Bool)
349*67e74705SXin Li // CHECK: T: [B5.8] && ...
350*67e74705SXin Li // CHECK: Preds (2): B6 B7
351*67e74705SXin Li // CHECK: Succs (2): B4 B3
352*67e74705SXin Li // CHECK: [B6]
353*67e74705SXin Li // CHECK: 1: ~B() (Temporary object destructor)
354*67e74705SXin Li // CHECK: Preds (1): B7
355*67e74705SXin Li // CHECK: Succs (1): B5
356*67e74705SXin Li // CHECK: [B7]
357*67e74705SXin Li // CHECK: 1: [B9.5] && [B8.5]
358*67e74705SXin Li // CHECK: 2: bool a = A() && B();
359*67e74705SXin Li // CHECK: T: (Temp Dtor) [B8.2]
360*67e74705SXin Li // CHECK: Preds (2): B8 B9
361*67e74705SXin Li // CHECK: Succs (2): B6 B5
362*67e74705SXin Li // CHECK: [B8]
363*67e74705SXin Li // CHECK: 1: B() (CXXConstructExpr, class B)
364*67e74705SXin Li // CHECK: 2: [B8.1] (BindTemporary)
365*67e74705SXin Li // CHECK: 3: [B8.2].operator bool
366*67e74705SXin Li // CHECK: 4: [B8.2]
367*67e74705SXin Li // CHECK: 5: [B8.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
368*67e74705SXin Li // CHECK: Preds (1): B9
369*67e74705SXin Li // CHECK: Succs (1): B7
370*67e74705SXin Li // CHECK: [B9]
371*67e74705SXin Li // CHECK: 1: A() (CXXConstructExpr, class A)
372*67e74705SXin Li // CHECK: 2: [B9.1] (BindTemporary)
373*67e74705SXin Li // CHECK: 3: [B9.2].operator bool
374*67e74705SXin Li // CHECK: 4: [B9.2]
375*67e74705SXin Li // CHECK: 5: [B9.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
376*67e74705SXin Li // CHECK: T: [B9.5] && ...
377*67e74705SXin Li // CHECK: Preds (1): B10
378*67e74705SXin Li // CHECK: Succs (2): B8 B7
379*67e74705SXin Li // CHECK: [B0 (EXIT)]
380*67e74705SXin Li // CHECK: Preds (1): B1
381*67e74705SXin Li // CHECK: [B10 (ENTRY)]
382*67e74705SXin Li // CHECK: Succs (1): B9
383*67e74705SXin Li // CHECK: [B1]
384*67e74705SXin Li // CHECK: 1: ~A() (Temporary object destructor)
385*67e74705SXin Li // CHECK: 2: int b;
386*67e74705SXin Li // CHECK: Preds (2): B2 B3
387*67e74705SXin Li // CHECK: Succs (1): B0
388*67e74705SXin Li // CHECK: [B2]
389*67e74705SXin Li // CHECK: 1: ~B() (Temporary object destructor)
390*67e74705SXin Li // CHECK: Preds (1): B3
391*67e74705SXin Li // CHECK: Succs (1): B1
392*67e74705SXin Li // CHECK: [B3]
393*67e74705SXin Li // CHECK: 1: [B5.8] || [B4.5]
394*67e74705SXin Li // CHECK: 2: [B5.3]([B3.1])
395*67e74705SXin Li // CHECK: T: (Temp Dtor) [B4.2]
396*67e74705SXin Li // CHECK: Preds (2): B4 B5
397*67e74705SXin Li // CHECK: Succs (2): B2 B1
398*67e74705SXin Li // CHECK: [B4]
399*67e74705SXin Li // CHECK: 1: B() (CXXConstructExpr, class B)
400*67e74705SXin Li // CHECK: 2: [B4.1] (BindTemporary)
401*67e74705SXin Li // CHECK: 3: [B4.2].operator bool
402*67e74705SXin Li // CHECK: 4: [B4.2]
403*67e74705SXin Li // CHECK: 5: [B4.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
404*67e74705SXin Li // CHECK: Preds (1): B5
405*67e74705SXin Li // CHECK: Succs (1): B3
406*67e74705SXin Li // CHECK: [B5]
407*67e74705SXin Li // CHECK: 1: ~A() (Temporary object destructor)
408*67e74705SXin Li // CHECK: 2: foo
409*67e74705SXin Li // CHECK: 3: [B5.2] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(_Bool))
410*67e74705SXin Li // CHECK: 4: A() (CXXConstructExpr, class A)
411*67e74705SXin Li // CHECK: 5: [B5.4] (BindTemporary)
412*67e74705SXin Li // CHECK: 6: [B5.5].operator bool
413*67e74705SXin Li // CHECK: 7: [B5.5]
414*67e74705SXin Li // CHECK: 8: [B5.7] (ImplicitCastExpr, UserDefinedConversion, _Bool)
415*67e74705SXin Li // CHECK: T: [B5.8] || ...
416*67e74705SXin Li // CHECK: Preds (2): B6 B7
417*67e74705SXin Li // CHECK: Succs (2): B3 B4
418*67e74705SXin Li // CHECK: [B6]
419*67e74705SXin Li // CHECK: 1: ~B() (Temporary object destructor)
420*67e74705SXin Li // CHECK: Preds (1): B7
421*67e74705SXin Li // CHECK: Succs (1): B5
422*67e74705SXin Li // CHECK: [B7]
423*67e74705SXin Li // CHECK: 1: [B9.5] || [B8.5]
424*67e74705SXin Li // CHECK: 2: bool a = A() || B();
425*67e74705SXin Li // CHECK: T: (Temp Dtor) [B8.2]
426*67e74705SXin Li // CHECK: Preds (2): B8 B9
427*67e74705SXin Li // CHECK: Succs (2): B6 B5
428*67e74705SXin Li // CHECK: [B8]
429*67e74705SXin Li // CHECK: 1: B() (CXXConstructExpr, class B)
430*67e74705SXin Li // CHECK: 2: [B8.1] (BindTemporary)
431*67e74705SXin Li // CHECK: 3: [B8.2].operator bool
432*67e74705SXin Li // CHECK: 4: [B8.2]
433*67e74705SXin Li // CHECK: 5: [B8.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
434*67e74705SXin Li // CHECK: Preds (1): B9
435*67e74705SXin Li // CHECK: Succs (1): B7
436*67e74705SXin Li // CHECK: [B9]
437*67e74705SXin Li // CHECK: 1: A() (CXXConstructExpr, class A)
438*67e74705SXin Li // CHECK: 2: [B9.1] (BindTemporary)
439*67e74705SXin Li // CHECK: 3: [B9.2].operator bool
440*67e74705SXin Li // CHECK: 4: [B9.2]
441*67e74705SXin Li // CHECK: 5: [B9.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
442*67e74705SXin Li // CHECK: T: [B9.5] || ...
443*67e74705SXin Li // CHECK: Preds (1): B10
444*67e74705SXin Li // CHECK: Succs (2): B7 B8
445*67e74705SXin Li // CHECK: [B0 (EXIT)]
446*67e74705SXin Li // CHECK: Preds (1): B1
447*67e74705SXin Li // CHECK: [B11 (ENTRY)]
448*67e74705SXin Li // CHECK: Succs (1): B10
449*67e74705SXin Li // CHECK: [B1]
450*67e74705SXin Li // CHECK: 1: int b;
451*67e74705SXin Li // CHECK: 2: [B7.5].~A() (Implicit destructor)
452*67e74705SXin Li // CHECK: Preds (2): B2 B3
453*67e74705SXin Li // CHECK: Succs (1): B0
454*67e74705SXin Li // CHECK: [B2]
455*67e74705SXin Li // CHECK: 1: foo
456*67e74705SXin Li // CHECK: 2: [B2.1] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(int))
457*67e74705SXin Li // CHECK: 3: 0
458*67e74705SXin Li // CHECK: 4: [B2.2]([B2.3])
459*67e74705SXin Li // CHECK: Preds (1): B4
460*67e74705SXin Li // CHECK: Succs (1): B1
461*67e74705SXin Li // CHECK: [B3]
462*67e74705SXin Li // CHECK: 1: foo
463*67e74705SXin Li // CHECK: 2: [B3.1] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(int))
464*67e74705SXin Li // CHECK: 3: 0
465*67e74705SXin Li // CHECK: 4: [B3.2]([B3.3])
466*67e74705SXin Li // CHECK: Preds (1): B4
467*67e74705SXin Li // CHECK: Succs (1): B1
468*67e74705SXin Li // CHECK: [B4]
469*67e74705SXin Li // CHECK: 1: ~B() (Temporary object destructor)
470*67e74705SXin Li // CHECK: 2: B() (CXXConstructExpr, class B)
471*67e74705SXin Li // CHECK: 3: [B4.2] (BindTemporary)
472*67e74705SXin Li // CHECK: 4: [B4.3].operator bool
473*67e74705SXin Li // CHECK: 5: [B4.3]
474*67e74705SXin Li // CHECK: 6: [B4.5] (ImplicitCastExpr, UserDefinedConversion, _Bool)
475*67e74705SXin Li // CHECK: 7: ~B() (Temporary object destructor)
476*67e74705SXin Li // CHECK: T: if [B4.6]
477*67e74705SXin Li // CHECK: Preds (2): B5 B6
478*67e74705SXin Li // CHECK: Succs (2): B3 B2
479*67e74705SXin Li // CHECK: [B5]
480*67e74705SXin Li // CHECK: 1: ~A() (Temporary object destructor)
481*67e74705SXin Li // CHECK: 2: ~A() (Temporary object destructor)
482*67e74705SXin Li // CHECK: Preds (1): B7
483*67e74705SXin Li // CHECK: Succs (1): B4
484*67e74705SXin Li // CHECK: [B6]
485*67e74705SXin Li // CHECK: 1: ~A() (Temporary object destructor)
486*67e74705SXin Li // CHECK: 2: ~A() (Temporary object destructor)
487*67e74705SXin Li // CHECK: 3: ~A() (Temporary object destructor)
488*67e74705SXin Li // CHECK: 4: ~B() (Temporary object destructor)
489*67e74705SXin Li // CHECK: Preds (1): B7
490*67e74705SXin Li // CHECK: Succs (1): B4
491*67e74705SXin Li // CHECK: [B7]
492*67e74705SXin Li // CHECK: 1: [B10.5] ? [B8.6] : [B9.15]
493*67e74705SXin Li // CHECK: 2: [B7.1] (ImplicitCastExpr, NoOp, const class A)
494*67e74705SXin Li // CHECK: 3: [B7.2]
495*67e74705SXin Li // CHECK: 4: [B7.3] (CXXConstructExpr, class A)
496*67e74705SXin Li // CHECK: 5: A a = B() ? A() : A(B());
497*67e74705SXin Li // CHECK: T: (Temp Dtor) [B9.2]
498*67e74705SXin Li // CHECK: Preds (2): B8 B9
499*67e74705SXin Li // CHECK: Succs (2): B6 B5
500*67e74705SXin Li // CHECK: [B8]
501*67e74705SXin Li // CHECK: 1: A() (CXXConstructExpr, class A)
502*67e74705SXin Li // CHECK: 2: [B8.1] (BindTemporary)
503*67e74705SXin Li // CHECK: 3: [B8.2] (ImplicitCastExpr, NoOp, const class A)
504*67e74705SXin Li // CHECK: 4: [B8.3]
505*67e74705SXin Li // CHECK: 5: [B8.4] (CXXConstructExpr, class A)
506*67e74705SXin Li // CHECK: 6: [B8.5] (BindTemporary)
507*67e74705SXin Li // CHECK: Preds (1): B10
508*67e74705SXin Li // CHECK: Succs (1): B7
509*67e74705SXin Li // CHECK: [B9]
510*67e74705SXin Li // CHECK: 1: B() (CXXConstructExpr, class B)
511*67e74705SXin Li // CHECK: 2: [B9.1] (BindTemporary)
512*67e74705SXin Li // CHECK: 3: [B9.2].operator A
513*67e74705SXin Li // CHECK: 4: [B9.2]
514*67e74705SXin Li // CHECK: 5: [B9.4] (ImplicitCastExpr, UserDefinedConversion, class A)
515*67e74705SXin Li // CHECK: 6: [B9.5] (BindTemporary)
516*67e74705SXin Li // CHECK: 7: [B9.6] (ImplicitCastExpr, NoOp, const class A)
517*67e74705SXin Li // CHECK: 8: [B9.7]
518*67e74705SXin Li // CHECK: 9: [B9.8] (CXXConstructExpr, class A)
519*67e74705SXin Li // CHECK: 10: [B9.9] (BindTemporary)
520*67e74705SXin Li // CHECK: 11: A([B9.10]) (CXXFunctionalCastExpr, ConstructorConversion, class A)
521*67e74705SXin Li // CHECK: 12: [B9.11] (ImplicitCastExpr, NoOp, const class A)
522*67e74705SXin Li // CHECK: 13: [B9.12]
523*67e74705SXin Li // CHECK: 14: [B9.13] (CXXConstructExpr, class A)
524*67e74705SXin Li // CHECK: 15: [B9.14] (BindTemporary)
525*67e74705SXin Li // CHECK: Preds (1): B10
526*67e74705SXin Li // CHECK: Succs (1): B7
527*67e74705SXin Li // CHECK: [B10]
528*67e74705SXin Li // CHECK: 1: B() (CXXConstructExpr, class B)
529*67e74705SXin Li // CHECK: 2: [B10.1] (BindTemporary)
530*67e74705SXin Li // CHECK: 3: [B10.2].operator bool
531*67e74705SXin Li // CHECK: 4: [B10.2]
532*67e74705SXin Li // CHECK: 5: [B10.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
533*67e74705SXin Li // CHECK: T: [B10.5] ? ... : ...
534*67e74705SXin Li // CHECK: Preds (1): B11
535*67e74705SXin Li // CHECK: Succs (2): B8 B9
536*67e74705SXin Li // CHECK: [B0 (EXIT)]
537*67e74705SXin Li // CHECK: Preds (1): B1
538*67e74705SXin Li // CHECK: [B2 (ENTRY)]
539*67e74705SXin Li // CHECK: Succs (1): B1
540*67e74705SXin Li // CHECK: [B1]
541*67e74705SXin Li // CHECK: 1: true
542*67e74705SXin Li // CHECK: 2: b_([B1.1]) (Member initializer)
543*67e74705SXin Li // CHECK: Preds (1): B2
544*67e74705SXin Li // CHECK: Succs (1): B0
545*67e74705SXin Li // CHECK: [B0 (EXIT)]
546*67e74705SXin Li // CHECK: Preds (1): B1
547*67e74705SXin Li // CHECK: [B1 (ENTRY)]
548*67e74705SXin Li // CHECK: Succs (1): B0
549*67e74705SXin Li // CHECK: [B0 (EXIT)]
550*67e74705SXin Li // CHECK: Preds (1): B1
551*67e74705SXin Li // CHECK: [B2 (ENTRY)]
552*67e74705SXin Li // CHECK: Succs (1): B1
553*67e74705SXin Li // CHECK: [B1]
554*67e74705SXin Li // CHECK: 1: this
555*67e74705SXin Li // CHECK: 2: [B1.1]->b_
556*67e74705SXin Li // CHECK: 3: [B1.2] (ImplicitCastExpr, LValueToRValue, _Bool)
557*67e74705SXin Li // CHECK: 4: return [B1.3];
558*67e74705SXin Li // CHECK: Preds (1): B2
559*67e74705SXin Li // CHECK: Succs (1): B0
560*67e74705SXin Li // CHECK: [B0 (EXIT)]
561*67e74705SXin Li // CHECK: Preds (1): B1
562*67e74705SXin Li // CHECK: [B2 (ENTRY)]
563*67e74705SXin Li // CHECK: Succs (1): B1
564*67e74705SXin Li // CHECK: [B1]
565*67e74705SXin Li // CHECK: 1: true
566*67e74705SXin Li // CHECK: 2: b_([B1.1]) (Member initializer)
567*67e74705SXin Li // CHECK: Preds (1): B2
568*67e74705SXin Li // CHECK: Succs (1): B0
569*67e74705SXin Li // CHECK: [B0 (EXIT)]
570*67e74705SXin Li // CHECK: Preds (1): B1
571*67e74705SXin Li // CHECK: [B2 (ENTRY)]
572*67e74705SXin Li // CHECK: Succs (1): B1
573*67e74705SXin Li // CHECK: [B1]
574*67e74705SXin Li // CHECK: 1: this
575*67e74705SXin Li // CHECK: 2: [B1.1]->b_
576*67e74705SXin Li // CHECK: 3: [B1.2] (ImplicitCastExpr, LValueToRValue, _Bool)
577*67e74705SXin Li // CHECK: 4: return [B1.3];
578*67e74705SXin Li // CHECK: Preds (1): B2
579*67e74705SXin Li // CHECK: Succs (1): B0
580*67e74705SXin Li // CHECK: [B0 (EXIT)]
581*67e74705SXin Li // CHECK: Preds (1): B1
582*67e74705SXin Li // CHECK: [B4 (ENTRY)]
583*67e74705SXin Li // CHECK: Succs (1): B3
584*67e74705SXin Li // CHECK: [B1]
585*67e74705SXin Li // CHECK: 1: 0
586*67e74705SXin Li // CHECK: 2: return [B1.1];
587*67e74705SXin Li // CHECK: Preds (1): B3
588*67e74705SXin Li // CHECK: Succs (1): B0
589*67e74705SXin Li // CHECK: [B2]
590*67e74705SXin Li // CHECK: 1: 1
591*67e74705SXin Li // CHECK: 2: return [B2.1];
592*67e74705SXin Li // CHECK: Preds (1): B3
593*67e74705SXin Li // CHECK: Succs (1): B0
594*67e74705SXin Li // CHECK: [B3]
595*67e74705SXin Li // CHECK: 1: C() (CXXConstructExpr, struct C)
596*67e74705SXin Li // CHECK: 2: [B3.1] (BindTemporary)
597*67e74705SXin Li // CHECK: 3: [B3.2].operator bool
598*67e74705SXin Li // CHECK: 4: [B3.2]
599*67e74705SXin Li // CHECK: 5: [B3.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
600*67e74705SXin Li // CHECK: 6: ~C() (Temporary object destructor)
601*67e74705SXin Li // CHECK: T: if [B3.5]
602*67e74705SXin Li // CHECK: Preds (1): B4
603*67e74705SXin Li // CHECK: Succs (2): B2 B1
604*67e74705SXin Li // CHECK: [B0 (EXIT)]
605*67e74705SXin Li // CHECK: Preds (2): B1 B2
606*67e74705SXin Li // CHECK: [B5 (ENTRY)]
607*67e74705SXin Li // CHECK: Succs (1): B4
608*67e74705SXin Li // CHECK: [B1]
609*67e74705SXin Li // CHECK: 1: [B4.6].~C() (Implicit destructor)
610*67e74705SXin Li // CHECK: Succs (1): B0
611*67e74705SXin Li // CHECK: [B2]
612*67e74705SXin Li // CHECK: 1: 0
613*67e74705SXin Li // CHECK: 2: return [B2.1];
614*67e74705SXin Li // CHECK: 3: [B4.6].~C() (Implicit destructor)
615*67e74705SXin Li // CHECK: Preds (1): B4
616*67e74705SXin Li // CHECK: Succs (1): B0
617*67e74705SXin Li // CHECK: [B3]
618*67e74705SXin Li // CHECK: 1: 1
619*67e74705SXin Li // CHECK: 2: return [B3.1];
620*67e74705SXin Li // CHECK: 3: [B4.6].~C() (Implicit destructor)
621*67e74705SXin Li // CHECK: Preds (1): B4
622*67e74705SXin Li // CHECK: Succs (1): B0
623*67e74705SXin Li // CHECK: [B4]
624*67e74705SXin Li // CHECK: 1: C() (CXXConstructExpr, struct C)
625*67e74705SXin Li // CHECK: 2: [B4.1] (BindTemporary)
626*67e74705SXin Li // CHECK: 3: [B4.2] (ImplicitCastExpr, NoOp, const struct C)
627*67e74705SXin Li // CHECK: 4: [B4.3]
628*67e74705SXin Li // CHECK: 5: [B4.4] (CXXConstructExpr, struct C)
629*67e74705SXin Li // CHECK: 6: C c = C();
630*67e74705SXin Li // CHECK: 7: ~C() (Temporary object destructor)
631*67e74705SXin Li // CHECK: 8: c
632*67e74705SXin Li // CHECK: 9: [B4.8].operator bool
633*67e74705SXin Li // CHECK: 10: [B4.8]
634*67e74705SXin Li // CHECK: 11: [B4.10] (ImplicitCastExpr, UserDefinedConversion, _Bool)
635*67e74705SXin Li // CHECK: T: if [B4.11]
636*67e74705SXin Li // CHECK: Preds (1): B5
637*67e74705SXin Li // CHECK: Succs (2): B3 B2
638*67e74705SXin Li // CHECK: [B0 (EXIT)]
639*67e74705SXin Li // CHECK: Preds (3): B1 B2 B3
640*67e74705SXin Li // CHECK: [B4 (ENTRY)]
641*67e74705SXin Li // CHECK: Succs (1): B3
642*67e74705SXin Li // CHECK: [B1]
643*67e74705SXin Li // CHECK: 1: 0
644*67e74705SXin Li // CHECK: 2: return [B1.1];
645*67e74705SXin Li // CHECK: Preds (1): B3
646*67e74705SXin Li // CHECK: Succs (1): B0
647*67e74705SXin Li // CHECK: [B2]
648*67e74705SXin Li // CHECK: 1: 1
649*67e74705SXin Li // CHECK: 2: return [B2.1];
650*67e74705SXin Li // CHECK: Preds (1): B3
651*67e74705SXin Li // CHECK: Succs (1): B0
652*67e74705SXin Li // CHECK: [B3]
653*67e74705SXin Li // CHECK: 1: D() (CXXConstructExpr, struct D)
654*67e74705SXin Li // CHECK: 2: [B3.1].operator bool
655*67e74705SXin Li // CHECK: 3: [B3.1]
656*67e74705SXin Li // CHECK: 4: [B3.3] (ImplicitCastExpr, UserDefinedConversion, _Bool)
657*67e74705SXin Li // CHECK: T: if [B3.4]
658*67e74705SXin Li // CHECK: Preds (1): B4
659*67e74705SXin Li // CHECK: Succs (2): B2 B1
660*67e74705SXin Li // CHECK: [B0 (EXIT)]
661*67e74705SXin Li // CHECK: Preds (2): B1 B2
662*67e74705SXin Li // CHECK: [B4 (ENTRY)]
663*67e74705SXin Li // CHECK: Succs (1): B3
664*67e74705SXin Li // CHECK: [B1]
665*67e74705SXin Li // CHECK: 1: 0
666*67e74705SXin Li // CHECK: 2: return [B1.1];
667*67e74705SXin Li // CHECK: Preds (1): B3
668*67e74705SXin Li // CHECK: Succs (1): B0
669*67e74705SXin Li // CHECK: [B2]
670*67e74705SXin Li // CHECK: 1: 1
671*67e74705SXin Li // CHECK: 2: return [B2.1];
672*67e74705SXin Li // CHECK: Preds (1): B3
673*67e74705SXin Li // CHECK: Succs (1): B0
674*67e74705SXin Li // CHECK: [B3]
675*67e74705SXin Li // CHECK: 1: D() (CXXConstructExpr, struct D)
676*67e74705SXin Li // CXX98: 2: [B3.1] (ImplicitCastExpr, NoOp, const struct D)
677*67e74705SXin Li // CXX98: 3: [B3.2]
678*67e74705SXin Li // CXX98: 4: [B3.3] (CXXConstructExpr, struct D)
679*67e74705SXin Li // CXX98: 5: D d = D();
680*67e74705SXin Li // CXX98: 6: d
681*67e74705SXin Li // CXX98: 7: [B3.6].operator bool
682*67e74705SXin Li // CXX98: 8: [B3.6]
683*67e74705SXin Li // CXX98: 9: [B3.8] (ImplicitCastExpr, UserDefinedConversion, _Bool)
684*67e74705SXin Li // CXX98: T: if [B3.9]
685*67e74705SXin Li // CXX11: 2: [B3.1]
686*67e74705SXin Li // CXX11: 3: [B3.2] (CXXConstructExpr, struct D)
687*67e74705SXin Li // CXX11: 4: D d = D();
688*67e74705SXin Li // CXX11: 5: d
689*67e74705SXin Li // CXX11: 6: [B3.5].operator bool
690*67e74705SXin Li // CXX11: 7: [B3.5]
691*67e74705SXin Li // CXX11: 8: [B3.7] (ImplicitCastExpr, UserDefinedConversion, _Bool)
692*67e74705SXin Li // CXX11: T: if [B3.8]
693*67e74705SXin Li // CHECK: Preds (1): B4
694*67e74705SXin Li // CHECK: Succs (2): B2 B1
695*67e74705SXin Li // CHECK: [B0 (EXIT)]
696*67e74705SXin Li // CHECK: Preds (2): B1 B2
697*67e74705SXin Li // CHECK: [B14 (ENTRY)]
698*67e74705SXin Li // CHECK: Succs (1): B13
699*67e74705SXin Li // CHECK: [B1]
700*67e74705SXin Li // CHECK: 1: ~B() (Temporary object destructor)
701*67e74705SXin Li // CHECK: 2: int b;
702*67e74705SXin Li // CHECK: 3: [B10.4].~A() (Implicit destructor)
703*67e74705SXin Li // CHECK: Preds (2): B2 B3
704*67e74705SXin Li // CHECK: Succs (1): B0
705*67e74705SXin Li // CHECK: [B2]
706*67e74705SXin Li // CHECK: 1: ~A() (Temporary object destructor)
707*67e74705SXin Li // CHECK: 2: ~A() (Temporary object destructor)
708*67e74705SXin Li // CHECK: Preds (1): B4
709*67e74705SXin Li // CHECK: Succs (1): B1
710*67e74705SXin Li // CHECK: [B3]
711*67e74705SXin Li // CHECK: 1: ~A() (Temporary object destructor)
712*67e74705SXin Li // CHECK: 2: ~A() (Temporary object destructor)
713*67e74705SXin Li // CHECK: 3: ~A() (Temporary object destructor)
714*67e74705SXin Li // CHECK: 4: ~B() (Temporary object destructor)
715*67e74705SXin Li // CHECK: Preds (1): B4
716*67e74705SXin Li // CHECK: Succs (1): B1
717*67e74705SXin Li // CHECK: [B4]
718*67e74705SXin Li // CHECK: 1: [B7.8] ? [B5.6] : [B6.15]
719*67e74705SXin Li // CHECK: 2: [B4.1] (ImplicitCastExpr, NoOp, const class A)
720*67e74705SXin Li // CHECK: 3: [B4.2]
721*67e74705SXin Li // CHECK: 4: [B7.3]([B4.3])
722*67e74705SXin Li // CHECK: T: (Temp Dtor) [B6.2]
723*67e74705SXin Li // CHECK: Preds (2): B5 B6
724*67e74705SXin Li // CHECK: Succs (2): B3 B2
725*67e74705SXin Li // CHECK: [B5]
726*67e74705SXin Li // CHECK: 1: A() (CXXConstructExpr, class A)
727*67e74705SXin Li // CHECK: 2: [B5.1] (BindTemporary)
728*67e74705SXin Li // CHECK: 3: [B5.2] (ImplicitCastExpr, NoOp, const class A)
729*67e74705SXin Li // CHECK: 4: [B5.3]
730*67e74705SXin Li // CHECK: 5: [B5.4] (CXXConstructExpr, class A)
731*67e74705SXin Li // CHECK: 6: [B5.5] (BindTemporary)
732*67e74705SXin Li // CHECK: Preds (1): B7
733*67e74705SXin Li // CHECK: Succs (1): B4
734*67e74705SXin Li // CHECK: [B6]
735*67e74705SXin Li // CHECK: 1: B() (CXXConstructExpr, class B)
736*67e74705SXin Li // CHECK: 2: [B6.1] (BindTemporary)
737*67e74705SXin Li // CHECK: 3: [B6.2].operator A
738*67e74705SXin Li // CHECK: 4: [B6.2]
739*67e74705SXin Li // CHECK: 5: [B6.4] (ImplicitCastExpr, UserDefinedConversion, class A)
740*67e74705SXin Li // CHECK: 6: [B6.5] (BindTemporary)
741*67e74705SXin Li // CHECK: 7: [B6.6] (ImplicitCastExpr, NoOp, const class A)
742*67e74705SXin Li // CHECK: 8: [B6.7]
743*67e74705SXin Li // CHECK: 9: [B6.8] (CXXConstructExpr, class A)
744*67e74705SXin Li // CHECK: 10: [B6.9] (BindTemporary)
745*67e74705SXin Li // CHECK: 11: A([B6.10]) (CXXFunctionalCastExpr, ConstructorConversion, class A)
746*67e74705SXin Li // CHECK: 12: [B6.11] (ImplicitCastExpr, NoOp, const class A)
747*67e74705SXin Li // CHECK: 13: [B6.12]
748*67e74705SXin Li // CHECK: 14: [B6.13] (CXXConstructExpr, class A)
749*67e74705SXin Li // CHECK: 15: [B6.14] (BindTemporary)
750*67e74705SXin Li // CHECK: Preds (1): B7
751*67e74705SXin Li // CHECK: Succs (1): B4
752*67e74705SXin Li // CHECK: [B7]
753*67e74705SXin Li // CHECK: 1: ~B() (Temporary object destructor)
754*67e74705SXin Li // CHECK: 2: foo
755*67e74705SXin Li // CHECK: 3: [B7.2] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(const class A &))
756*67e74705SXin Li // CHECK: 4: B() (CXXConstructExpr, class B)
757*67e74705SXin Li // CHECK: 5: [B7.4] (BindTemporary)
758*67e74705SXin Li // CHECK: 6: [B7.5].operator bool
759*67e74705SXin Li // CHECK: 7: [B7.5]
760*67e74705SXin Li // CHECK: 8: [B7.7] (ImplicitCastExpr, UserDefinedConversion, _Bool)
761*67e74705SXin Li // CHECK: T: [B7.8] ? ... : ...
762*67e74705SXin Li // CHECK: Preds (2): B8 B9
763*67e74705SXin Li // CHECK: Succs (2): B5 B6
764*67e74705SXin Li // CHECK: [B8]
765*67e74705SXin Li // CHECK: 1: ~A() (Temporary object destructor)
766*67e74705SXin Li // CHECK: Preds (1): B10
767*67e74705SXin Li // CHECK: Succs (1): B7
768*67e74705SXin Li // CHECK: [B9]
769*67e74705SXin Li // CHECK: 1: ~A() (Temporary object destructor)
770*67e74705SXin Li // CHECK: 2: ~A() (Temporary object destructor)
771*67e74705SXin Li // CHECK: 3: ~B() (Temporary object destructor)
772*67e74705SXin Li // CHECK: Preds (1): B10
773*67e74705SXin Li // CHECK: Succs (1): B7
774*67e74705SXin Li // CHECK: [B10]
775*67e74705SXin Li // CHECK: 1: [B13.5] ? [B11.6] : [B12.15]
776*67e74705SXin Li // CHECK: 2: [B10.1] (ImplicitCastExpr, NoOp, const class A)
777*67e74705SXin Li // CHECK: 3: [B10.2]
778*67e74705SXin Li // CHECK: 4: const A &a = B() ? A() : A(B());
779*67e74705SXin Li // CHECK: T: (Temp Dtor) [B12.2]
780*67e74705SXin Li // CHECK: Preds (2): B11 B12
781*67e74705SXin Li // CHECK: Succs (2): B9 B8
782*67e74705SXin Li // CHECK: [B11]
783*67e74705SXin Li // CHECK: 1: A() (CXXConstructExpr, class A)
784*67e74705SXin Li // CHECK: 2: [B11.1] (BindTemporary)
785*67e74705SXin Li // CHECK: 3: [B11.2] (ImplicitCastExpr, NoOp, const class A)
786*67e74705SXin Li // CHECK: 4: [B11.3]
787*67e74705SXin Li // CHECK: 5: [B11.4] (CXXConstructExpr, class A)
788*67e74705SXin Li // CHECK: 6: [B11.5] (BindTemporary)
789*67e74705SXin Li // CHECK: Preds (1): B13
790*67e74705SXin Li // CHECK: Succs (1): B10
791*67e74705SXin Li // CHECK: [B12]
792*67e74705SXin Li // CHECK: 1: B() (CXXConstructExpr, class B)
793*67e74705SXin Li // CHECK: 2: [B12.1] (BindTemporary)
794*67e74705SXin Li // CHECK: 3: [B12.2].operator A
795*67e74705SXin Li // CHECK: 4: [B12.2]
796*67e74705SXin Li // CHECK: 5: [B12.4] (ImplicitCastExpr, UserDefinedConversion, class A)
797*67e74705SXin Li // CHECK: 6: [B12.5] (BindTemporary)
798*67e74705SXin Li // CHECK: 7: [B12.6] (ImplicitCastExpr, NoOp, const class A)
799*67e74705SXin Li // CHECK: 8: [B12.7]
800*67e74705SXin Li // CHECK: 9: [B12.8] (CXXConstructExpr, class A)
801*67e74705SXin Li // CHECK: 10: [B12.9] (BindTemporary)
802*67e74705SXin Li // CHECK: 11: A([B12.10]) (CXXFunctionalCastExpr, ConstructorConversion, class A)
803*67e74705SXin Li // CHECK: 12: [B12.11] (ImplicitCastExpr, NoOp, const class A)
804*67e74705SXin Li // CHECK: 13: [B12.12]
805*67e74705SXin Li // CHECK: 14: [B12.13] (CXXConstructExpr, class A)
806*67e74705SXin Li // CHECK: 15: [B12.14] (BindTemporary)
807*67e74705SXin Li // CHECK: Preds (1): B13
808*67e74705SXin Li // CHECK: Succs (1): B10
809*67e74705SXin Li // CHECK: [B13]
810*67e74705SXin Li // CHECK: 1: B() (CXXConstructExpr, class B)
811*67e74705SXin Li // CHECK: 2: [B13.1] (BindTemporary)
812*67e74705SXin Li // CHECK: 3: [B13.2].operator bool
813*67e74705SXin Li // CHECK: 4: [B13.2]
814*67e74705SXin Li // CHECK: 5: [B13.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
815*67e74705SXin Li // CHECK: T: [B13.5] ? ... : ...
816*67e74705SXin Li // CHECK: Preds (1): B14
817*67e74705SXin Li // CHECK: Succs (2): B11 B12
818*67e74705SXin Li // CHECK: [B0 (EXIT)]
819*67e74705SXin Li // CHECK: Preds (1): B1
820*67e74705SXin Li // CHECK: [B8 (ENTRY)]
821*67e74705SXin Li // CHECK: Succs (1): B7
822*67e74705SXin Li // CHECK: [B1]
823*67e74705SXin Li // CHECK: 1: int b;
824*67e74705SXin Li // CHECK: 2: [B4.5].~A() (Implicit destructor)
825*67e74705SXin Li // CHECK: Preds (2): B2 B3
826*67e74705SXin Li // CHECK: Succs (1): B0
827*67e74705SXin Li // CHECK: [B2]
828*67e74705SXin Li // CHECK: 1: ~A() (Temporary object destructor)
829*67e74705SXin Li // CHECK: Preds (1): B4
830*67e74705SXin Li // CHECK: Succs (1): B1
831*67e74705SXin Li // CHECK: [B3]
832*67e74705SXin Li // CHECK: 1: ~A() (Temporary object destructor)
833*67e74705SXin Li // CHECK: 2: ~A() (Temporary object destructor)
834*67e74705SXin Li // CHECK: Preds (1): B4
835*67e74705SXin Li // CHECK: Succs (1): B1
836*67e74705SXin Li // CHECK: [B4]
837*67e74705SXin Li // CHECK: 1: [B7.2] ?: [B6.6]
838*67e74705SXin Li // CHECK: 2: [B4.1] (ImplicitCastExpr, NoOp, const class A)
839*67e74705SXin Li // CHECK: 3: [B4.2]
840*67e74705SXin Li // CHECK: 4: [B4.3] (CXXConstructExpr, class A)
841*67e74705SXin Li // CHECK: 5: A a = A() ?: A();
842*67e74705SXin Li // CHECK: T: (Temp Dtor) [B6.2]
843*67e74705SXin Li // CHECK: Preds (2): B5 B6
844*67e74705SXin Li // CHECK: Succs (2): B3 B2
845*67e74705SXin Li // CHECK: [B5]
846*67e74705SXin Li // CHECK: 1: [B7.2] (ImplicitCastExpr, NoOp, const class A)
847*67e74705SXin Li // CHECK: 2: [B5.1]
848*67e74705SXin Li // CHECK: 3: [B5.2] (CXXConstructExpr, class A)
849*67e74705SXin Li // CHECK: 4: [B5.3] (BindTemporary)
850*67e74705SXin Li // CHECK: Preds (1): B7
851*67e74705SXin Li // CHECK: Succs (1): B4
852*67e74705SXin Li // CHECK: [B6]
853*67e74705SXin Li // CHECK: 1: A() (CXXConstructExpr, class A)
854*67e74705SXin Li // CHECK: 2: [B6.1] (BindTemporary)
855*67e74705SXin Li // CHECK: 3: [B6.2] (ImplicitCastExpr, NoOp, const class A)
856*67e74705SXin Li // CHECK: 4: [B6.3]
857*67e74705SXin Li // CHECK: 5: [B6.4] (CXXConstructExpr, class A)
858*67e74705SXin Li // CHECK: 6: [B6.5] (BindTemporary)
859*67e74705SXin Li // CHECK: Preds (1): B7
860*67e74705SXin Li // CHECK: Succs (1): B4
861*67e74705SXin Li // CHECK: [B7]
862*67e74705SXin Li // CHECK: 1: A() (CXXConstructExpr, class A)
863*67e74705SXin Li // CHECK: 2: [B7.1] (BindTemporary)
864*67e74705SXin Li // CHECK: 3: [B7.2].operator bool
865*67e74705SXin Li // CHECK: 4: [B7.2]
866*67e74705SXin Li // CHECK: 5: [B7.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
867*67e74705SXin Li // CHECK: T: [B7.5] ? ... : ...
868*67e74705SXin Li // CHECK: Preds (1): B8
869*67e74705SXin Li // CHECK: Succs (2): B5 B6
870*67e74705SXin Li // CHECK: [B0 (EXIT)]
871*67e74705SXin Li // CHECK: Preds (1): B1
872*67e74705SXin Li // CHECK: [B13 (ENTRY)]
873*67e74705SXin Li // CHECK: Succs (1): B12
874*67e74705SXin Li // CHECK: [B1]
875*67e74705SXin Li // CHECK: 1: int b;
876*67e74705SXin Li // CHECK: 2: [B9.4].~A() (Implicit destructor)
877*67e74705SXin Li // CHECK: Preds (2): B2 B3
878*67e74705SXin Li // CHECK: Succs (1): B0
879*67e74705SXin Li // CHECK: [B2]
880*67e74705SXin Li // CHECK: 1: ~A() (Temporary object destructor)
881*67e74705SXin Li // CHECK: Preds (1): B4
882*67e74705SXin Li // CHECK: Succs (1): B1
883*67e74705SXin Li // CHECK: [B3]
884*67e74705SXin Li // CHECK: 1: ~A() (Temporary object destructor)
885*67e74705SXin Li // CHECK: 2: ~A() (Temporary object destructor)
886*67e74705SXin Li // CHECK: Preds (1): B4
887*67e74705SXin Li // CHECK: Succs (1): B1
888*67e74705SXin Li // CHECK: [B4]
889*67e74705SXin Li // CHECK: 1: [B7.4] ?: [B6.6]
890*67e74705SXin Li // CHECK: 2: [B4.1] (ImplicitCastExpr, NoOp, const class A)
891*67e74705SXin Li // CHECK: 3: [B4.2]
892*67e74705SXin Li // CHECK: 4: [B7.2]([B4.3])
893*67e74705SXin Li // CHECK: T: (Temp Dtor) [B6.2]
894*67e74705SXin Li // CHECK: Preds (2): B5 B6
895*67e74705SXin Li // CHECK: Succs (2): B3 B2
896*67e74705SXin Li // CHECK: [B5]
897*67e74705SXin Li // CHECK: 1: [B7.4] (ImplicitCastExpr, NoOp, const class A)
898*67e74705SXin Li // CHECK: 2: [B5.1]
899*67e74705SXin Li // CHECK: 3: [B5.2] (CXXConstructExpr, class A)
900*67e74705SXin Li // CHECK: 4: [B5.3] (BindTemporary)
901*67e74705SXin Li // CHECK: Preds (1): B7
902*67e74705SXin Li // CHECK: Succs (1): B4
903*67e74705SXin Li // CHECK: [B6]
904*67e74705SXin Li // CHECK: 1: A() (CXXConstructExpr, class A)
905*67e74705SXin Li // CHECK: 2: [B6.1] (BindTemporary)
906*67e74705SXin Li // CHECK: 3: [B6.2] (ImplicitCastExpr, NoOp, const class A)
907*67e74705SXin Li // CHECK: 4: [B6.3]
908*67e74705SXin Li // CHECK: 5: [B6.4] (CXXConstructExpr, class A)
909*67e74705SXin Li // CHECK: 6: [B6.5] (BindTemporary)
910*67e74705SXin Li // CHECK: Preds (1): B7
911*67e74705SXin Li // CHECK: Succs (1): B4
912*67e74705SXin Li // CHECK: [B7]
913*67e74705SXin Li // CHECK: 1: foo
914*67e74705SXin Li // CHECK: 2: [B7.1] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(const class A &))
915*67e74705SXin Li // CHECK: 3: A() (CXXConstructExpr, class A)
916*67e74705SXin Li // CHECK: 4: [B7.3] (BindTemporary)
917*67e74705SXin Li // CHECK: 5: [B7.4].operator bool
918*67e74705SXin Li // CHECK: 6: [B7.4]
919*67e74705SXin Li // CHECK: 7: [B7.6] (ImplicitCastExpr, UserDefinedConversion, _Bool)
920*67e74705SXin Li // CHECK: T: [B7.7] ? ... : ...
921*67e74705SXin Li // CHECK: Preds (2): B8 B9
922*67e74705SXin Li // CHECK: Succs (2): B5 B6
923*67e74705SXin Li // CHECK: [B8]
924*67e74705SXin Li // CHECK: 1: ~A() (Temporary object destructor)
925*67e74705SXin Li // CHECK: Preds (1): B9
926*67e74705SXin Li // CHECK: Succs (1): B7
927*67e74705SXin Li // CHECK: [B9]
928*67e74705SXin Li // CHECK: 1: [B12.2] ?: [B11.6]
929*67e74705SXin Li // CHECK: 2: [B9.1] (ImplicitCastExpr, NoOp, const class A)
930*67e74705SXin Li // CHECK: 3: [B9.2]
931*67e74705SXin Li // CHECK: 4: const A &a = A() ?: A();
932*67e74705SXin Li // CHECK: T: (Temp Dtor) [B11.2]
933*67e74705SXin Li // CHECK: Preds (2): B10 B11
934*67e74705SXin Li // CHECK: Succs (2): B8 B7
935*67e74705SXin Li // CHECK: [B10]
936*67e74705SXin Li // CHECK: 1: [B12.2] (ImplicitCastExpr, NoOp, const class A)
937*67e74705SXin Li // CHECK: 2: [B10.1]
938*67e74705SXin Li // CHECK: 3: [B10.2] (CXXConstructExpr, class A)
939*67e74705SXin Li // CHECK: 4: [B10.3] (BindTemporary)
940*67e74705SXin Li // CHECK: Preds (1): B12
941*67e74705SXin Li // CHECK: Succs (1): B9
942*67e74705SXin Li // CHECK: [B11]
943*67e74705SXin Li // CHECK: 1: A() (CXXConstructExpr, class A)
944*67e74705SXin Li // CHECK: 2: [B11.1] (BindTemporary)
945*67e74705SXin Li // CHECK: 3: [B11.2] (ImplicitCastExpr, NoOp, const class A)
946*67e74705SXin Li // CHECK: 4: [B11.3]
947*67e74705SXin Li // CHECK: 5: [B11.4] (CXXConstructExpr, class A)
948*67e74705SXin Li // CHECK: 6: [B11.5] (BindTemporary)
949*67e74705SXin Li // CHECK: Preds (1): B12
950*67e74705SXin Li // CHECK: Succs (1): B9
951*67e74705SXin Li // CHECK: [B12]
952*67e74705SXin Li // CHECK: 1: A() (CXXConstructExpr, class A)
953*67e74705SXin Li // CHECK: 2: [B12.1] (BindTemporary)
954*67e74705SXin Li // CHECK: 3: [B12.2].operator bool
955*67e74705SXin Li // CHECK: 4: [B12.2]
956*67e74705SXin Li // CHECK: 5: [B12.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
957*67e74705SXin Li // CHECK: T: [B12.5] ? ... : ...
958*67e74705SXin Li // CHECK: Preds (1): B13
959*67e74705SXin Li // CHECK: Succs (2): B10 B11
960*67e74705SXin Li // CHECK: [B0 (EXIT)]
961*67e74705SXin Li // CHECK: Preds (1): B1
962*67e74705SXin Li // CHECK: [B2 (ENTRY)]
963*67e74705SXin Li // CHECK: Succs (1): B1
964*67e74705SXin Li // CHECK: [B1]
965*67e74705SXin Li // CHECK: 1: A() (CXXConstructExpr, class A)
966*67e74705SXin Li // CHECK: 2: [B1.1] (BindTemporary)
967*67e74705SXin Li // CHECK: 3: [B1.2] (ImplicitCastExpr, NoOp, const class A)
968*67e74705SXin Li // CHECK: 4: [B1.3]
969*67e74705SXin Li // CHECK: 5: [B1.4] (CXXConstructExpr, class A)
970*67e74705SXin Li // CHECK: 6: A a = A();
971*67e74705SXin Li // CHECK: 7: ~A() (Temporary object destructor)
972*67e74705SXin Li // CHECK: 8: int b;
973*67e74705SXin Li // CHECK: 9: [B1.6].~A() (Implicit destructor)
974*67e74705SXin Li // CHECK: Preds (1): B2
975*67e74705SXin Li // CHECK: Succs (1): B0
976*67e74705SXin Li // CHECK: [B0 (EXIT)]
977*67e74705SXin Li // CHECK: Preds (1): B1
978*67e74705SXin Li // CHECK: [B2 (ENTRY)]
979*67e74705SXin Li // CHECK: Succs (1): B1
980*67e74705SXin Li // CHECK: [B1]
981*67e74705SXin Li // CHECK: 1: A() (CXXConstructExpr, class A)
982*67e74705SXin Li // CHECK: 2: [B1.1] (BindTemporary)
983*67e74705SXin Li // CHECK: 3: [B1.2] (ImplicitCastExpr, NoOp, const class A)
984*67e74705SXin Li // CHECK: 4: [B1.3]
985*67e74705SXin Li // CHECK: 5: const A &a = A();
986*67e74705SXin Li // CHECK: 6: foo
987*67e74705SXin Li // CHECK: 7: [B1.6] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(const class A &))
988*67e74705SXin Li // CHECK: 8: A() (CXXConstructExpr, class A)
989*67e74705SXin Li // CHECK: 9: [B1.8] (BindTemporary)
990*67e74705SXin Li // CHECK: 10: [B1.9] (ImplicitCastExpr, NoOp, const class A)
991*67e74705SXin Li // CHECK: 11: [B1.10]
992*67e74705SXin Li // CHECK: 12: [B1.7]([B1.11])
993*67e74705SXin Li // CHECK: 13: ~A() (Temporary object destructor)
994*67e74705SXin Li // CHECK: 14: int b;
995*67e74705SXin Li // CHECK: 15: [B1.5].~A() (Implicit destructor)
996*67e74705SXin Li // CHECK: Preds (1): B2
997*67e74705SXin Li // CHECK: Succs (1): B0
998*67e74705SXin Li // CHECK: [B0 (EXIT)]
999*67e74705SXin Li // CHECK: Preds (1): B1
1000*67e74705SXin Li // CHECK: [B2 (ENTRY)]
1001*67e74705SXin Li // CHECK: Succs (1): B1
1002*67e74705SXin Li // CHECK: [B1]
1003*67e74705SXin Li // CHECK: 1: A::make
1004*67e74705SXin Li // CHECK: 2: [B1.1] (ImplicitCastExpr, FunctionToPointerDecay, class A (*)(void))
1005*67e74705SXin Li // CHECK: 3: [B1.2]()
1006*67e74705SXin Li // CHECK: 4: [B1.3] (BindTemporary)
1007*67e74705SXin Li // CHECK: 5: [B1.4] (ImplicitCastExpr, NoOp, const class A)
1008*67e74705SXin Li // CHECK: 6: [B1.5]
1009*67e74705SXin Li // CHECK: 7: [B1.6] (CXXConstructExpr, class A)
1010*67e74705SXin Li // CHECK: 8: A a = A::make();
1011*67e74705SXin Li // CHECK: 9: ~A() (Temporary object destructor)
1012*67e74705SXin Li // CHECK: 10: int b;
1013*67e74705SXin Li // CHECK: 11: [B1.8].~A() (Implicit destructor)
1014*67e74705SXin Li // CHECK: Preds (1): B2
1015*67e74705SXin Li // CHECK: Succs (1): B0
1016*67e74705SXin Li // CHECK: [B0 (EXIT)]
1017*67e74705SXin Li // CHECK: Preds (1): B1
1018*67e74705SXin Li // CHECK: [B2 (ENTRY)]
1019*67e74705SXin Li // CHECK: Succs (1): B1
1020*67e74705SXin Li // CHECK: [B1]
1021*67e74705SXin Li // CHECK: 1: A::make
1022*67e74705SXin Li // CHECK: 2: [B1.1] (ImplicitCastExpr, FunctionToPointerDecay, class A (*)(void))
1023*67e74705SXin Li // CHECK: 3: [B1.2]()
1024*67e74705SXin Li // CHECK: 4: [B1.3] (BindTemporary)
1025*67e74705SXin Li // CHECK: 5: [B1.4] (ImplicitCastExpr, NoOp, const class A)
1026*67e74705SXin Li // CHECK: 6: [B1.5]
1027*67e74705SXin Li // CHECK: 7: const A &a = A::make();
1028*67e74705SXin Li // CHECK: 8: foo
1029*67e74705SXin Li // CHECK: 9: [B1.8] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(const class A &))
1030*67e74705SXin Li // CHECK: 10: A::make
1031*67e74705SXin Li // CHECK: 11: [B1.10] (ImplicitCastExpr, FunctionToPointerDecay, class A (*)(void))
1032*67e74705SXin Li // CHECK: 12: [B1.11]()
1033*67e74705SXin Li // CHECK: 13: [B1.12] (BindTemporary)
1034*67e74705SXin Li // CHECK: 14: [B1.13] (ImplicitCastExpr, NoOp, const class A)
1035*67e74705SXin Li // CHECK: 15: [B1.14]
1036*67e74705SXin Li // CHECK: 16: [B1.9]([B1.15])
1037*67e74705SXin Li // CHECK: 17: ~A() (Temporary object destructor)
1038*67e74705SXin Li // CHECK: 18: int b;
1039*67e74705SXin Li // CHECK: 19: [B1.7].~A() (Implicit destructor)
1040*67e74705SXin Li // CHECK: Preds (1): B2
1041*67e74705SXin Li // CHECK: Succs (1): B0
1042*67e74705SXin Li // CHECK: [B0 (EXIT)]
1043*67e74705SXin Li // CHECK: Preds (1): B1
1044*67e74705SXin Li // CHECK: [B2 (ENTRY)]
1045*67e74705SXin Li // CHECK: Succs (1): B1
1046*67e74705SXin Li // CHECK: [B1]
1047*67e74705SXin Li // CHECK: 1: int a;
1048*67e74705SXin Li // CHECK: 2: A() (CXXConstructExpr, class A)
1049*67e74705SXin Li // CHECK: 3: [B1.2] (BindTemporary)
1050*67e74705SXin Li // CHECK: 4: [B1.3].operator int
1051*67e74705SXin Li // CHECK: 5: [B1.3]
1052*67e74705SXin Li // CHECK: 6: [B1.5] (ImplicitCastExpr, UserDefinedConversion, int)
1053*67e74705SXin Li // CHECK: 7: a
1054*67e74705SXin Li // CHECK: 8: [B1.7] = [B1.6]
1055*67e74705SXin Li // CHECK: 9: ~A() (Temporary object destructor)
1056*67e74705SXin Li // CHECK: 10: int b;
1057*67e74705SXin Li // CHECK: Preds (1): B2
1058*67e74705SXin Li // CHECK: Succs (1): B0
1059*67e74705SXin Li // CHECK: [B0 (EXIT)]
1060*67e74705SXin Li // CHECK: Preds (1): B1
1061*67e74705SXin Li // CHECK: [B2 (ENTRY)]
1062*67e74705SXin Li // CHECK: Succs (1): B1
1063*67e74705SXin Li // CHECK: [B1]
1064*67e74705SXin Li // CHECK: 1: A() (CXXConstructExpr, class A)
1065*67e74705SXin Li // CHECK: 2: [B1.1] (BindTemporary)
1066*67e74705SXin Li // CHECK: 3: [B1.2].operator int
1067*67e74705SXin Li // CHECK: 4: [B1.2]
1068*67e74705SXin Li // CHECK: 5: [B1.4] (ImplicitCastExpr, UserDefinedConversion, int)
1069*67e74705SXin Li // CHECK: 6: int([B1.5]) (CXXFunctionalCastExpr, NoOp, int)
1070*67e74705SXin Li // CHECK: 7: B() (CXXConstructExpr, class B)
1071*67e74705SXin Li // CHECK: 8: [B1.7] (BindTemporary)
1072*67e74705SXin Li // CHECK: 9: [B1.8].operator int
1073*67e74705SXin Li // CHECK: 10: [B1.8]
1074*67e74705SXin Li // CHECK: 11: [B1.10] (ImplicitCastExpr, UserDefinedConversion, int)
1075*67e74705SXin Li // CHECK: 12: int([B1.11]) (CXXFunctionalCastExpr, NoOp, int)
1076*67e74705SXin Li // CHECK: 13: [B1.6] + [B1.12]
1077*67e74705SXin Li // CHECK: 14: a([B1.13]) (Member initializer)
1078*67e74705SXin Li // CHECK: 15: ~B() (Temporary object destructor)
1079*67e74705SXin Li // CHECK: 16: ~A() (Temporary object destructor)
1080*67e74705SXin Li // CHECK: 17: /*implicit*/(int)0
1081*67e74705SXin Li // CHECK: 18: b([B1.17]) (Member initializer)
1082*67e74705SXin Li // CHECK: Preds (1): B2
1083*67e74705SXin Li // CHECK: Succs (1): B0
1084*67e74705SXin Li // CHECK: [B0 (EXIT)]
1085*67e74705SXin Li // CHECK: Preds (1): B1
1086*67e74705SXin Li // CHECK: [B3 (ENTRY)]
1087*67e74705SXin Li // CHECK: Succs (1): B2
1088*67e74705SXin Li // CHECK: [B1]
1089*67e74705SXin Li // CHECK: 1: int b;
1090*67e74705SXin Li // CHECK: Preds (1): B2(Unreachable)
1091*67e74705SXin Li // CHECK: Succs (1): B0
1092*67e74705SXin Li // CHECK: [B2 (NORETURN)]
1093*67e74705SXin Li // CHECK: 1: int a;
1094*67e74705SXin Li // CHECK: 2: NoReturn() (CXXConstructExpr, class NoReturn)
1095*67e74705SXin Li // CHECK: 3: [B2.2] (BindTemporary)
1096*67e74705SXin Li // CHECK: 4: [B2.3].f
1097*67e74705SXin Li // CHECK: 5: [B2.4]()
1098*67e74705SXin Li // CHECK: 6: ~NoReturn() (Temporary object destructor)
1099*67e74705SXin Li // CHECK: Preds (1): B3
1100*67e74705SXin Li // CHECK: Succs (1): B0
1101*67e74705SXin Li // CHECK: [B0 (EXIT)]
1102*67e74705SXin Li // CHECK: Preds (2): B1 B2
1103*67e74705SXin Li // CHECK: [B3 (ENTRY)]
1104*67e74705SXin Li // CHECK: Succs (1): B2
1105*67e74705SXin Li // CHECK: [B1]
1106*67e74705SXin Li // CHECK: 1: int b;
1107*67e74705SXin Li // CHECK: Preds (1): B2(Unreachable)
1108*67e74705SXin Li // CHECK: Succs (1): B0
1109*67e74705SXin Li // CHECK: [B2 (NORETURN)]
1110*67e74705SXin Li // CHECK: 1: int a;
1111*67e74705SXin Li // CHECK: 2: NoReturn() (CXXConstructExpr, class NoReturn)
1112*67e74705SXin Li // CHECK: 3: [B2.2] (BindTemporary)
1113*67e74705SXin Li // CHECK: 4: 47
1114*67e74705SXin Li // CHECK: 5: ... , [B2.4]
1115*67e74705SXin Li // CHECK: 6: ~NoReturn() (Temporary object destructor)
1116*67e74705SXin Li // CHECK: Preds (1): B3
1117*67e74705SXin Li // CHECK: Succs (1): B0
1118*67e74705SXin Li // CHECK: [B0 (EXIT)]
1119*67e74705SXin Li // CHECK: Preds (2): B1 B2
1120*67e74705SXin Li // CHECK: [B9 (ENTRY)]
1121*67e74705SXin Li // CHECK: Succs (1): B8
1122*67e74705SXin Li // CHECK: [B1]
1123*67e74705SXin Li // CHECK: 1: 0
1124*67e74705SXin Li // CHECK: 2: return [B1.1];
1125*67e74705SXin Li // CHECK: Preds (2): B3 B8
1126*67e74705SXin Li // CHECK: Succs (1): B0
1127*67e74705SXin Li // CHECK: [B2]
1128*67e74705SXin Li // CHECK: 1: 1
1129*67e74705SXin Li // CHECK: 2: return [B2.1];
1130*67e74705SXin Li // CHECK: Preds (1): B3
1131*67e74705SXin Li // CHECK: Succs (1): B0
1132*67e74705SXin Li // CHECK: [B3]
1133*67e74705SXin Li // CHECK: T: if [B5.1]
1134*67e74705SXin Li // CHECK: Preds (2): B4(Unreachable) B5
1135*67e74705SXin Li // CHECK: Succs (2): B2 B1
1136*67e74705SXin Li // CHECK: [B4 (NORETURN)]
1137*67e74705SXin Li // CHECK: 1: ~NoReturn() (Temporary object destructor)
1138*67e74705SXin Li // CHECK: Preds (1): B5
1139*67e74705SXin Li // CHECK: Succs (1): B0
1140*67e74705SXin Li // CHECK: [B5]
1141*67e74705SXin Li // CHECK: 1: [B7.3] || [B6.7]
1142*67e74705SXin Li // CHECK: T: (Temp Dtor) [B6.4]
1143*67e74705SXin Li // CHECK: Preds (2): B6 B7
1144*67e74705SXin Li // CHECK: Succs (2): B4 B3
1145*67e74705SXin Li // CHECK: [B6]
1146*67e74705SXin Li // CHECK: 1: check
1147*67e74705SXin Li // CHECK: 2: [B6.1] (ImplicitCastExpr, FunctionToPointerDecay, _Bool (*)(const class NoReturn &))
1148*67e74705SXin Li // CHECK: 3: NoReturn() (CXXConstructExpr, class NoReturn)
1149*67e74705SXin Li // CHECK: 4: [B6.3] (BindTemporary)
1150*67e74705SXin Li // CHECK: 5: [B6.4] (ImplicitCastExpr, NoOp, const class NoReturn)
1151*67e74705SXin Li // CHECK: 6: [B6.5]
1152*67e74705SXin Li // CHECK: 7: [B6.2]([B6.6])
1153*67e74705SXin Li // CHECK: Preds (1): B7
1154*67e74705SXin Li // CHECK: Succs (1): B5
1155*67e74705SXin Li // CHECK: [B7]
1156*67e74705SXin Li // CHECK: 1: value
1157*67e74705SXin Li // CHECK: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)
1158*67e74705SXin Li // CHECK: 3: ![B7.2]
1159*67e74705SXin Li // CHECK: T: [B7.3] || ...
1160*67e74705SXin Li // CHECK: Preds (1): B8
1161*67e74705SXin Li // CHECK: Succs (2): B5 B6
1162*67e74705SXin Li // CHECK: [B8]
1163*67e74705SXin Li // CHECK: 1: value
1164*67e74705SXin Li // CHECK: 2: [B8.1] (ImplicitCastExpr, LValueToRValue, _Bool)
1165*67e74705SXin Li // CHECK: T: if [B8.2]
1166*67e74705SXin Li // CHECK: Preds (1): B9
1167*67e74705SXin Li // CHECK: Succs (2): B7 B1
1168*67e74705SXin Li // CHECK: [B0 (EXIT)]
1169*67e74705SXin Li // CHECK: Preds (3): B1 B2 B4
1170*67e74705SXin Li // CHECK: [B10 (ENTRY)]
1171*67e74705SXin Li // CHECK: Succs (1): B9
1172*67e74705SXin Li // CHECK: [B1]
1173*67e74705SXin Li // CHECK: 1: 0
1174*67e74705SXin Li // CHECK: 2: return [B1.1];
1175*67e74705SXin Li // CHECK: Preds (2): B3 B9
1176*67e74705SXin Li // CHECK: Succs (1): B0
1177*67e74705SXin Li // CHECK: [B2]
1178*67e74705SXin Li // CHECK: 1: 1
1179*67e74705SXin Li // CHECK: 2: return [B2.1];
1180*67e74705SXin Li // CHECK: Preds (1): B3
1181*67e74705SXin Li // CHECK: Succs (1): B0
1182*67e74705SXin Li // CHECK: [B3]
1183*67e74705SXin Li // CHECK: T: if [B5.1]
1184*67e74705SXin Li // CHECK: Preds (2): B4(Unreachable) B5
1185*67e74705SXin Li // CHECK: Succs (2): B2 B1
1186*67e74705SXin Li // CHECK: [B4 (NORETURN)]
1187*67e74705SXin Li // CHECK: 1: ~NoReturn() (Temporary object destructor)
1188*67e74705SXin Li // CHECK: Preds (1): B5
1189*67e74705SXin Li // CHECK: Succs (1): B0
1190*67e74705SXin Li // CHECK: [B5]
1191*67e74705SXin Li // CHECK: 1: [B8.3] || [B7.3] || [B6.7]
1192*67e74705SXin Li // CHECK: T: (Temp Dtor) [B6.4]
1193*67e74705SXin Li // CHECK: Preds (3): B6 B7 B8
1194*67e74705SXin Li // CHECK: Succs (2): B4 B3
1195*67e74705SXin Li // CHECK: [B6]
1196*67e74705SXin Li // CHECK: 1: check
1197*67e74705SXin Li // CHECK: 2: [B6.1] (ImplicitCastExpr, FunctionToPointerDecay, _Bool (*)(const class NoReturn &))
1198*67e74705SXin Li // CHECK: 3: NoReturn() (CXXConstructExpr, class NoReturn)
1199*67e74705SXin Li // CHECK: 4: [B6.3] (BindTemporary)
1200*67e74705SXin Li // CHECK: 5: [B6.4] (ImplicitCastExpr, NoOp, const class NoReturn)
1201*67e74705SXin Li // CHECK: 6: [B6.5]
1202*67e74705SXin Li // CHECK: 7: [B6.2]([B6.6])
1203*67e74705SXin Li // CHECK: Preds (1): B7
1204*67e74705SXin Li // CHECK: Succs (1): B5
1205*67e74705SXin Li // CHECK: [B7]
1206*67e74705SXin Li // CHECK: 1: value
1207*67e74705SXin Li // CHECK: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)
1208*67e74705SXin Li // CHECK: 3: ![B7.2]
1209*67e74705SXin Li // CHECK: T: [B8.3] || [B7.3] || ...
1210*67e74705SXin Li // CHECK: Preds (1): B8
1211*67e74705SXin Li // CHECK: Succs (2): B5 B6
1212*67e74705SXin Li // CHECK: [B8]
1213*67e74705SXin Li // CHECK: 1: value
1214*67e74705SXin Li // CHECK: 2: [B8.1] (ImplicitCastExpr, LValueToRValue, _Bool)
1215*67e74705SXin Li // CHECK: 3: ![B8.2]
1216*67e74705SXin Li // CHECK: T: [B8.3] || ...
1217*67e74705SXin Li // CHECK: Preds (1): B9
1218*67e74705SXin Li // CHECK: Succs (2): B5 B7
1219*67e74705SXin Li // CHECK: [B9]
1220*67e74705SXin Li // CHECK: 1: value
1221*67e74705SXin Li // CHECK: 2: [B9.1] (ImplicitCastExpr, LValueToRValue, _Bool)
1222*67e74705SXin Li // CHECK: T: if [B9.2]
1223*67e74705SXin Li // CHECK: Preds (1): B10
1224*67e74705SXin Li // CHECK: Succs (2): B8 B1
1225*67e74705SXin Li // CHECK: [B0 (EXIT)]
1226*67e74705SXin Li // CHECK: Preds (3): B1 B2 B4
1227*67e74705SXin Li // CHECK: [B10 (ENTRY)]
1228*67e74705SXin Li // CHECK: Succs (1): B9
1229*67e74705SXin Li // CHECK: [B1]
1230*67e74705SXin Li // CHECK: 1: 0
1231*67e74705SXin Li // CHECK: 2: return [B1.1];
1232*67e74705SXin Li // CHECK: Preds (2): B3 B9
1233*67e74705SXin Li // CHECK: Succs (1): B0
1234*67e74705SXin Li // CHECK: [B2]
1235*67e74705SXin Li // CHECK: 1: 1
1236*67e74705SXin Li // CHECK: 2: return [B2.1];
1237*67e74705SXin Li // CHECK: Preds (1): B3
1238*67e74705SXin Li // CHECK: Succs (1): B0
1239*67e74705SXin Li // CHECK: [B3]
1240*67e74705SXin Li // CHECK: T: if [B5.1]
1241*67e74705SXin Li // CHECK: Preds (2): B4(Unreachable) B5
1242*67e74705SXin Li // CHECK: Succs (2): B2 B1
1243*67e74705SXin Li // CHECK: [B4 (NORETURN)]
1244*67e74705SXin Li // CHECK: 1: ~NoReturn() (Temporary object destructor)
1245*67e74705SXin Li // CHECK: Preds (1): B5
1246*67e74705SXin Li // CHECK: Succs (1): B0
1247*67e74705SXin Li // CHECK: [B5]
1248*67e74705SXin Li // CHECK: 1: [B8.3] || [B7.2] || [B6.7]
1249*67e74705SXin Li // CHECK: T: (Temp Dtor) [B6.4]
1250*67e74705SXin Li // CHECK: Preds (3): B6 B7 B8
1251*67e74705SXin Li // CHECK: Succs (2): B4 B3
1252*67e74705SXin Li // CHECK: [B6]
1253*67e74705SXin Li // CHECK: 1: check
1254*67e74705SXin Li // CHECK: 2: [B6.1] (ImplicitCastExpr, FunctionToPointerDecay, _Bool (*)(const class NoReturn &))
1255*67e74705SXin Li // CHECK: 3: NoReturn() (CXXConstructExpr, class NoReturn)
1256*67e74705SXin Li // CHECK: 4: [B6.3] (BindTemporary)
1257*67e74705SXin Li // CHECK: 5: [B6.4] (ImplicitCastExpr, NoOp, const class NoReturn)
1258*67e74705SXin Li // CHECK: 6: [B6.5]
1259*67e74705SXin Li // CHECK: 7: [B6.2]([B6.6])
1260*67e74705SXin Li // CHECK: Preds (1): B7
1261*67e74705SXin Li // CHECK: Succs (1): B5
1262*67e74705SXin Li // CHECK: [B7]
1263*67e74705SXin Li // CHECK: 1: value
1264*67e74705SXin Li // CHECK: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)
1265*67e74705SXin Li // CHECK: T: [B8.3] || [B7.2] || ...
1266*67e74705SXin Li // CHECK: Preds (1): B8
1267*67e74705SXin Li // CHECK: Succs (2): B5 B6
1268*67e74705SXin Li // CHECK: [B8]
1269*67e74705SXin Li // CHECK: 1: value
1270*67e74705SXin Li // CHECK: 2: [B8.1] (ImplicitCastExpr, LValueToRValue, _Bool)
1271*67e74705SXin Li // CHECK: 3: ![B8.2]
1272*67e74705SXin Li // CHECK: T: [B8.3] || ...
1273*67e74705SXin Li // CHECK: Preds (1): B9
1274*67e74705SXin Li // CHECK: Succs (2): B5 B7
1275*67e74705SXin Li // CHECK: [B9]
1276*67e74705SXin Li // CHECK: 1: value
1277*67e74705SXin Li // CHECK: 2: [B9.1] (ImplicitCastExpr, LValueToRValue, _Bool)
1278*67e74705SXin Li // CHECK: T: if [B9.2]
1279*67e74705SXin Li // CHECK: Preds (1): B10
1280*67e74705SXin Li // CHECK: Succs (2): B8 B1
1281*67e74705SXin Li // CHECK: [B0 (EXIT)]
1282*67e74705SXin Li // CHECK: Preds (3): B1 B2 B4
1283