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