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