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