Home | History | Annotate | Download | only in Analysis
      1 // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -analyze -analyzer-checker=debug.DumpCFG -cfg-add-implicit-dtors %s 2>&1 | FileCheck %s
      2 // XPASS: *
      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:  [ B2 (ENTRY) ]
    159 // CHECK:     Predecessors (0):
    160 // CHECK:     Successors (1): B1
    161 // CHECK:  [ B1 ]
    162 // CHECK:       1:
    163 // CHECK:       2: A a;
    164 // CHECK:       3: a
    165 // CHECK:       4: [B1.3]
    166 // CHECK:       5: const A &b = a;
    167 // CHECK:       6: A()
    168 // CHECK:       7: [B1.6] (BindTemporary)
    169 // CHECK:       8: [B1.7]
    170 // CHECK:       9: [B1.8]
    171 // CHECK:      10: const A &c = A();
    172 // CHECK:      11: [B1.10].~A() (Implicit destructor)
    173 // CHECK:      12: [B1.2].~A() (Implicit destructor)
    174 // CHECK:     Predecessors (1): B2
    175 // CHECK:     Successors (1): B0
    176 // CHECK:  [ B0 (EXIT) ]
    177 // CHECK:     Predecessors (1): B1
    178 // CHECK:     Successors (0):
    179 // CHECK:  [ B2 (ENTRY) ]
    180 // CHECK:     Predecessors (0):
    181 // CHECK:     Successors (1): B1
    182 // CHECK:  [ B1 ]
    183 // CHECK:       1:
    184 // CHECK:       2: A a[2];
    185 // CHECK:       3:
    186 // CHECK:       4: A b[0];
    187 // CHECK:       5: [B1.2].~A() (Implicit destructor)
    188 // CHECK:     Predecessors (1): B2
    189 // CHECK:     Successors (1): B0
    190 // CHECK:  [ B0 (EXIT) ]
    191 // CHECK:     Predecessors (1): B1
    192 // CHECK:     Successors (0):
    193 // CHECK:  [ B2 (ENTRY) ]
    194 // CHECK:     Predecessors (0):
    195 // CHECK:     Successors (1): B1
    196 // CHECK:  [ B1 ]
    197 // CHECK:       1:
    198 // CHECK:       2: A a;
    199 // CHECK:       3:
    200 // CHECK:       4: A c;
    201 // CHECK:       5:
    202 // CHECK:       6: A d;
    203 // CHECK:       7: [B1.6].~A() (Implicit destructor)
    204 // CHECK:       8: [B1.4].~A() (Implicit destructor)
    205 // CHECK:       9:
    206 // CHECK:      10: A b;
    207 // CHECK:      11: [B1.10].~A() (Implicit destructor)
    208 // CHECK:      12: [B1.2].~A() (Implicit destructor)
    209 // CHECK:     Predecessors (1): B2
    210 // CHECK:     Successors (1): B0
    211 // CHECK:  [ B0 (EXIT) ]
    212 // CHECK:     Predecessors (1): B1
    213 // CHECK:     Successors (0):
    214 // CHECK:  [ B4 (ENTRY) ]
    215 // CHECK:     Predecessors (0):
    216 // CHECK:     Successors (1): B3
    217 // CHECK:  [ B1 ]
    218 // CHECK:       1:
    219 // CHECK:       2: A c;
    220 // CHECK:       3: [B1.2].~A() (Implicit destructor)
    221 // CHECK:       4: [B3.4].~A() (Implicit destructor)
    222 // CHECK:       5: [B3.2].~A() (Implicit destructor)
    223 // CHECK:     Predecessors (1): B3
    224 // CHECK:     Successors (1): B0
    225 // CHECK:  [ B2 ]
    226 // CHECK:       1: return;
    227 // CHECK:       2: [B3.4].~A() (Implicit destructor)
    228 // CHECK:       3: [B3.2].~A() (Implicit destructor)
    229 // CHECK:     Predecessors (1): B3
    230 // CHECK:     Successors (1): B0
    231 // CHECK:  [ B3 ]
    232 // CHECK:       1:
    233 // CHECK:       2: A a;
    234 // CHECK:       3:
    235 // CHECK:       4: A b;
    236 // CHECK:       5: UV
    237 // CHECK:       6: [B3.5]
    238 // CHECK:       T: if [B3.6]
    239 // CHECK:     Predecessors (1): B4
    240 // CHECK:     Successors (2): B2 B1
    241 // CHECK:  [ B0 (EXIT) ]
    242 // CHECK:     Predecessors (2): B1 B2
    243 // CHECK:     Successors (0):
    244 // CHECK:  [ B8 (ENTRY) ]
    245 // CHECK:     Predecessors (0):
    246 // CHECK:     Successors (1): B7
    247 // CHECK:  [ B1 ]
    248 // CHECK:     l1:
    249 // CHECK:       1:
    250 // CHECK:       2: A c;
    251 // CHECK:       3: [B1.2].~A() (Implicit destructor)
    252 // CHECK:       4: [B6.2].~A() (Implicit destructor)
    253 // CHECK:       5: [B7.2].~A() (Implicit destructor)
    254 // CHECK:     Predecessors (2): B2 B3
    255 // CHECK:     Successors (1): B0
    256 // CHECK:  [ B2 ]
    257 // CHECK:       1:
    258 // CHECK:       2: A b;
    259 // CHECK:       3: [B2.2].~A() (Implicit destructor)
    260 // CHECK:       4: [B6.4].~A() (Implicit destructor)
    261 // CHECK:     Predecessors (1): B4
    262 // CHECK:     Successors (1): B1
    263 // CHECK:  [ B3 ]
    264 // CHECK:       1: [B6.4].~A() (Implicit destructor)
    265 // CHECK:       T: goto l1;
    266 // CHECK:     Predecessors (1): B4
    267 // CHECK:     Successors (1): B1
    268 // CHECK:  [ B4 ]
    269 // CHECK:       1: UV
    270 // CHECK:       2: [B4.1]
    271 // CHECK:       T: if [B4.2]
    272 // CHECK:     Predecessors (1): B6
    273 // CHECK:     Successors (2): B3 B2
    274 // CHECK:  [ B5 ]
    275 // CHECK:       1: [B6.4].~A() (Implicit destructor)
    276 // CHECK:       2: [B6.2].~A() (Implicit destructor)
    277 // CHECK:       T: goto l0;
    278 // CHECK:     Predecessors (1): B6
    279 // CHECK:     Successors (1): B6
    280 // CHECK:  [ B6 ]
    281 // CHECK:     l0:
    282 // CHECK:       1:
    283 // CHECK:       2: A b;
    284 // CHECK:       3:
    285 // CHECK:       4: A a;
    286 // CHECK:       5: UV
    287 // CHECK:       6: [B6.5]
    288 // CHECK:       T: if [B6.6]
    289 // CHECK:     Predecessors (2): B7 B5
    290 // CHECK:     Successors (2): B5 B4
    291 // CHECK:  [ B7 ]
    292 // CHECK:       1:
    293 // CHECK:       2: A a;
    294 // CHECK:     Predecessors (1): B8
    295 // CHECK:     Successors (1): B6
    296 // CHECK:  [ B0 (EXIT) ]
    297 // CHECK:     Predecessors (1): B1
    298 // CHECK:     Successors (0):
    299 // CHECK:  [ B5 (ENTRY) ]
    300 // CHECK:     Predecessors (0):
    301 // CHECK:     Successors (1): B4
    302 // CHECK:  [ B1 ]
    303 // CHECK:       1: [B4.6].~A() (Implicit destructor)
    304 // CHECK:       2: [B4.2].~A() (Implicit destructor)
    305 // CHECK:     Predecessors (2): B2 B3
    306 // CHECK:     Successors (1): B0
    307 // CHECK:  [ B2 ]
    308 // CHECK:       1:
    309 // CHECK:       2: A c;
    310 // CHECK:       3: [B2.2].~A() (Implicit destructor)
    311 // CHECK:     Predecessors (1): B4
    312 // CHECK:     Successors (1): B1
    313 // CHECK:  [ B3 ]
    314 // CHECK:       1:
    315 // CHECK:       2: A c;
    316 // CHECK:       3: [B3.2].~A() (Implicit destructor)
    317 // CHECK:     Predecessors (1): B4
    318 // CHECK:     Successors (1): B1
    319 // CHECK:  [ B4 ]
    320 // CHECK:       1:
    321 // CHECK:       2: A a;
    322 // CHECK:       3: a
    323 // CHECK:       4: [B4.3]
    324 // CHECK:       5: [B4.4]
    325 // CHECK:       6: A b = a;
    326 // CHECK:       7: b
    327 // CHECK:       8: [B4.7]
    328 // CHECK:       9: [B4.8].operator int
    329 // CHECK:      10: [B4.9]()
    330 // CHECK:      11: [B4.10]
    331 // CHECK:       T: if [B4.11]
    332 // CHECK:     Predecessors (1): B5
    333 // CHECK:     Successors (2): B3 B2
    334 // CHECK:  [ B0 (EXIT) ]
    335 // CHECK:     Predecessors (1): B1
    336 // CHECK:     Successors (0):
    337 // CHECK:  [ B9 (ENTRY) ]
    338 // CHECK:     Predecessors (0):
    339 // CHECK:     Successors (1): B8
    340 // CHECK:  [ B1 ]
    341 // CHECK:       1: [B8.6].~A() (Implicit destructor)
    342 // CHECK:       2:
    343 // CHECK:       3: A e;
    344 // CHECK:       4: [B1.3].~A() (Implicit destructor)
    345 // CHECK:       5: [B8.2].~A() (Implicit destructor)
    346 // CHECK:     Predecessors (2): B2 B5
    347 // CHECK:     Successors (1): B0
    348 // CHECK:  [ B2 ]
    349 // CHECK:       1:
    350 // CHECK:       2: A d;
    351 // CHECK:       3: [B2.2].~A() (Implicit destructor)
    352 // CHECK:       4: [B4.2].~A() (Implicit destructor)
    353 // CHECK:     Predecessors (1): B4
    354 // CHECK:     Successors (1): B1
    355 // CHECK:  [ B3 ]
    356 // CHECK:       1: return;
    357 // CHECK:       2: [B4.2].~A() (Implicit destructor)
    358 // CHECK:       3: [B8.6].~A() (Implicit destructor)
    359 // CHECK:       4: [B8.2].~A() (Implicit destructor)
    360 // CHECK:     Predecessors (1): B4
    361 // CHECK:     Successors (1): B0
    362 // CHECK:  [ B4 ]
    363 // CHECK:       1:
    364 // CHECK:       2: A c;
    365 // CHECK:       3: UV
    366 // CHECK:       4: [B4.3]
    367 // CHECK:       T: if [B4.4]
    368 // CHECK:     Predecessors (1): B8
    369 // CHECK:     Successors (2): B3 B2
    370 // CHECK:  [ B5 ]
    371 // CHECK:       1:
    372 // CHECK:       2: A d;
    373 // CHECK:       3: [B5.2].~A() (Implicit destructor)
    374 // CHECK:       4: [B7.2].~A() (Implicit destructor)
    375 // CHECK:     Predecessors (1): B7
    376 // CHECK:     Successors (1): B1
    377 // CHECK:  [ B6 ]
    378 // CHECK:       1: return;
    379 // CHECK:       2: [B7.2].~A() (Implicit destructor)
    380 // CHECK:       3: [B8.6].~A() (Implicit destructor)
    381 // CHECK:       4: [B8.2].~A() (Implicit destructor)
    382 // CHECK:     Predecessors (1): B7
    383 // CHECK:     Successors (1): B0
    384 // CHECK:  [ B7 ]
    385 // CHECK:       1:
    386 // CHECK:       2: A c;
    387 // CHECK:       3: UV
    388 // CHECK:       4: [B7.3]
    389 // CHECK:       T: if [B7.4]
    390 // CHECK:     Predecessors (1): B8
    391 // CHECK:     Successors (2): B6 B5
    392 // CHECK:  [ B8 ]
    393 // CHECK:       1:
    394 // CHECK:       2: A a;
    395 // CHECK:       3: a
    396 // CHECK:       4: [B8.3]
    397 // CHECK:       5: [B8.4]
    398 // CHECK:       6: A b = a;
    399 // CHECK:       7: b
    400 // CHECK:       8: [B8.7]
    401 // CHECK:       9: [B8.8].operator int
    402 // CHECK:      10: [B8.9]()
    403 // CHECK:      11: [B8.10]
    404 // CHECK:       T: if [B8.11]
    405 // CHECK:     Predecessors (1): B9
    406 // CHECK:     Successors (2): B7 B4
    407 // CHECK:  [ B0 (EXIT) ]
    408 // CHECK:     Predecessors (3): B1 B3 B6
    409 // CHECK:     Successors (0):
    410 // CHECK:  [ B6 (ENTRY) ]
    411 // CHECK:     Predecessors (0):
    412 // CHECK:     Successors (1): B5
    413 // CHECK:  [ B1 ]
    414 // CHECK:       1: [B2.4].~A() (Implicit destructor)
    415 // CHECK:       2: [B5.2].~A() (Implicit destructor)
    416 // CHECK:     Predecessors (1): B2
    417 // CHECK:     Successors (1): B0
    418 // CHECK:  [ B2 ]
    419 // CHECK:       1: a
    420 // CHECK:       2: [B2.1]
    421 // CHECK:       3: [B2.2]
    422 // CHECK:       4: A b = a;
    423 // CHECK:       5: b
    424 // CHECK:       6: [B2.5]
    425 // CHECK:       7: [B2.6].operator int
    426 // CHECK:       8: [B2.7]()
    427 // CHECK:       9: [B2.8]
    428 // CHECK:       T: while [B2.9]
    429 // CHECK:     Predecessors (2): B3 B5
    430 // CHECK:     Successors (2): B4 B1
    431 // CHECK:  [ B3 ]
    432 // CHECK:     Predecessors (1): B4
    433 // CHECK:     Successors (1): B2
    434 // CHECK:  [ B4 ]
    435 // CHECK:       1:
    436 // CHECK:       2: A c;
    437 // CHECK:       3: [B4.2].~A() (Implicit destructor)
    438 // CHECK:       4: [B2.4].~A() (Implicit destructor)
    439 // CHECK:     Predecessors (1): B2
    440 // CHECK:     Successors (1): B3
    441 // CHECK:  [ B5 ]
    442 // CHECK:       1:
    443 // CHECK:       2: A a;
    444 // CHECK:     Predecessors (1): B6
    445 // CHECK:     Successors (1): B2
    446 // CHECK:  [ B0 (EXIT) ]
    447 // CHECK:     Predecessors (1): B1
    448 // CHECK:     Successors (0):
    449 // CHECK:  [ B12 (ENTRY) ]
    450 // CHECK:     Predecessors (0):
    451 // CHECK:     Successors (1): B11
    452 // CHECK:  [ B1 ]
    453 // CHECK:       1: [B2.4].~A() (Implicit destructor)
    454 // CHECK:       2:
    455 // CHECK:       3: A e;
    456 // CHECK:       4: [B1.3].~A() (Implicit destructor)
    457 // CHECK:       5: [B11.2].~A() (Implicit destructor)
    458 // CHECK:     Predecessors (2): B9 B2
    459 // CHECK:     Successors (1): B0
    460 // CHECK:  [ B2 ]
    461 // CHECK:       1: a
    462 // CHECK:       2: [B2.1]
    463 // CHECK:       3: [B2.2]
    464 // CHECK:       4: A b = a;
    465 // CHECK:       5: b
    466 // CHECK:       6: [B2.5]
    467 // CHECK:       7: [B2.6].operator int
    468 // CHECK:       8: [B2.7]()
    469 // CHECK:       9: [B2.8]
    470 // CHECK:       T: while [B2.9]
    471 // CHECK:     Predecessors (2): B3 B11
    472 // CHECK:     Successors (2): B10 B1
    473 // CHECK:  [ B3 ]
    474 // CHECK:     Predecessors (2): B4 B7
    475 // CHECK:     Successors (1): B2
    476 // CHECK:  [ B4 ]
    477 // CHECK:       1:
    478 // CHECK:       2: A d;
    479 // CHECK:       3: [B4.2].~A() (Implicit destructor)
    480 // CHECK:       4: [B10.2].~A() (Implicit destructor)
    481 // CHECK:       5: [B2.4].~A() (Implicit destructor)
    482 // CHECK:     Predecessors (1): B6
    483 // CHECK:     Successors (1): B3
    484 // CHECK:  [ B5 ]
    485 // CHECK:       1: return;
    486 // CHECK:       2: [B10.2].~A() (Implicit destructor)
    487 // CHECK:       3: [B2.4].~A() (Implicit destructor)
    488 // CHECK:       4: [B11.2].~A() (Implicit destructor)
    489 // CHECK:     Predecessors (1): B6
    490 // CHECK:     Successors (1): B0
    491 // CHECK:  [ B6 ]
    492 // CHECK:       1: UV
    493 // CHECK:       2: [B6.1]
    494 // CHECK:       T: if [B6.2]
    495 // CHECK:     Predecessors (1): B8
    496 // CHECK:     Successors (2): B5 B4
    497 // CHECK:  [ B7 ]
    498 // CHECK:       1: [B10.2].~A() (Implicit destructor)
    499 // CHECK:       2: [B2.4].~A() (Implicit destructor)
    500 // CHECK:       T: continue;
    501 // CHECK:     Predecessors (1): B8
    502 // CHECK:     Successors (1): B3
    503 // CHECK:  [ B8 ]
    504 // CHECK:       1: UV
    505 // CHECK:       2: [B8.1]
    506 // CHECK:       T: if [B8.2]
    507 // CHECK:     Predecessors (1): B10
    508 // CHECK:     Successors (2): B7 B6
    509 // CHECK:  [ B9 ]
    510 // CHECK:       1: [B10.2].~A() (Implicit destructor)
    511 // CHECK:       T: break;
    512 // CHECK:     Predecessors (1): B10
    513 // CHECK:     Successors (1): B1
    514 // CHECK:  [ B10 ]
    515 // CHECK:       1:
    516 // CHECK:       2: A c;
    517 // CHECK:       3: UV
    518 // CHECK:       4: [B10.3]
    519 // CHECK:       T: if [B10.4]
    520 // CHECK:     Predecessors (1): B2
    521 // CHECK:     Successors (2): B9 B8
    522 // CHECK:  [ B11 ]
    523 // CHECK:       1:
    524 // CHECK:       2: A a;
    525 // CHECK:     Predecessors (1): B12
    526 // CHECK:     Successors (1): B2
    527 // CHECK:  [ B0 (EXIT) ]
    528 // CHECK:     Predecessors (2): B1 B5
    529 // CHECK:     Successors (0):
    530 // CHECK:  [ B4 (ENTRY) ]
    531 // CHECK:     Predecessors (0):
    532 // CHECK:     Successors (1): B2
    533 // CHECK:  [ B1 ]
    534 // CHECK:       1: UV
    535 // CHECK:       2: [B1.1]
    536 // CHECK:       T: do ... while [B1.2]
    537 // CHECK:     Predecessors (1): B2
    538 // CHECK:     Successors (2): B3 B0
    539 // CHECK:  [ B2 ]
    540 // CHECK:       1:
    541 // CHECK:       2: A a;
    542 // CHECK:       3: [B2.2].~A() (Implicit destructor)
    543 // CHECK:     Predecessors (2): B3 B4
    544 // CHECK:     Successors (1): B1
    545 // CHECK:  [ B3 ]
    546 // CHECK:     Predecessors (1): B1
    547 // CHECK:     Successors (1): B2
    548 // CHECK:  [ B0 (EXIT) ]
    549 // CHECK:     Predecessors (1): B1
    550 // CHECK:     Successors (0):
    551 // CHECK:  [ B12 (ENTRY) ]
    552 // CHECK:     Predecessors (0):
    553 // CHECK:     Successors (1): B11
    554 // CHECK:  [ B1 ]
    555 // CHECK:       1:
    556 // CHECK:       2: A d;
    557 // CHECK:       3: [B1.2].~A() (Implicit destructor)
    558 // CHECK:       4: [B11.2].~A() (Implicit destructor)
    559 // CHECK:     Predecessors (2): B8 B2
    560 // CHECK:     Successors (1): B0
    561 // CHECK:  [ B2 ]
    562 // CHECK:       1: UV
    563 // CHECK:       2: [B2.1]
    564 // CHECK:       T: do ... while [B2.2]
    565 // CHECK:     Predecessors (2): B3 B6
    566 // CHECK:     Successors (2): B10 B1
    567 // CHECK:  [ B3 ]
    568 // CHECK:       1:
    569 // CHECK:       2: A c;
    570 // CHECK:       3: [B3.2].~A() (Implicit destructor)
    571 // CHECK:       4: [B9.2].~A() (Implicit destructor)
    572 // CHECK:     Predecessors (1): B5
    573 // CHECK:     Successors (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:     Predecessors (1): B5
    579 // CHECK:     Successors (1): B0
    580 // CHECK:  [ B5 ]
    581 // CHECK:       1: UV
    582 // CHECK:       2: [B5.1]
    583 // CHECK:       T: if [B5.2]
    584 // CHECK:     Predecessors (1): B7
    585 // CHECK:     Successors (2): B4 B3
    586 // CHECK:  [ B6 ]
    587 // CHECK:       1: [B9.2].~A() (Implicit destructor)
    588 // CHECK:       T: continue;
    589 // CHECK:     Predecessors (1): B7
    590 // CHECK:     Successors (1): B2
    591 // CHECK:  [ B7 ]
    592 // CHECK:       1: UV
    593 // CHECK:       2: [B7.1]
    594 // CHECK:       T: if [B7.2]
    595 // CHECK:     Predecessors (1): B9
    596 // CHECK:     Successors (2): B6 B5
    597 // CHECK:  [ B8 ]
    598 // CHECK:       1: [B9.2].~A() (Implicit destructor)
    599 // CHECK:       T: break;
    600 // CHECK:     Predecessors (1): B9
    601 // CHECK:     Successors (1): B1
    602 // CHECK:  [ B9 ]
    603 // CHECK:       1:
    604 // CHECK:       2: A b;
    605 // CHECK:       3: UV
    606 // CHECK:       4: [B9.3]
    607 // CHECK:       T: if [B9.4]
    608 // CHECK:     Predecessors (2): B10 B11
    609 // CHECK:     Successors (2): B8 B7
    610 // CHECK:  [ B10 ]
    611 // CHECK:     Predecessors (1): B2
    612 // CHECK:     Successors (1): B9
    613 // CHECK:  [ B11 ]
    614 // CHECK:       1:
    615 // CHECK:       2: A a;
    616 // CHECK:     Predecessors (1): B12
    617 // CHECK:     Successors (1): B9
    618 // CHECK:  [ B0 (EXIT) ]
    619 // CHECK:     Predecessors (2): B1 B4
    620 // CHECK:     Successors (0):
    621 // CHECK:  [ B4 (ENTRY) ]
    622 // CHECK:     Predecessors (0):
    623 // CHECK:     Successors (1): B2
    624 // CHECK:  [ B1 ]
    625 // CHECK:       1: [B2.6].~A() (Implicit destructor)
    626 // CHECK:       2: [B2.2].~A() (Implicit destructor)
    627 // CHECK:     Predecessors (2): B3 B2
    628 // CHECK:     Successors (1): B0
    629 // CHECK:  [ B2 ]
    630 // CHECK:       1:
    631 // CHECK:       2: A a;
    632 // CHECK:       3: a
    633 // CHECK:       4: [B2.3]
    634 // CHECK:       5: [B2.4]
    635 // CHECK:       6: A b = a;
    636 // CHECK:       7: b
    637 // CHECK:       8: [B2.7]
    638 // CHECK:       9: [B2.8].operator int
    639 // CHECK:      10: [B2.9]()
    640 // CHECK:       T: switch [B2.10]
    641 // CHECK:     Predecessors (1): B4
    642 // CHECK:     Successors (1): B1
    643 // CHECK:  [ B3 ]
    644 // CHECK:       1:
    645 // CHECK:       2: A c;
    646 // CHECK:       3: [B3.2].~A() (Implicit destructor)
    647 // CHECK:     Predecessors (0):
    648 // CHECK:     Successors (1): B1
    649 // CHECK:  [ B0 (EXIT) ]
    650 // CHECK:     Predecessors (1): B1
    651 // CHECK:     Successors (0):
    652 // CHECK:  [ B9 (ENTRY) ]
    653 // CHECK:     Predecessors (0):
    654 // CHECK:     Successors (1): B2
    655 // CHECK:  [ B1 ]
    656 // CHECK:       1: [B2.6].~A() (Implicit destructor)
    657 // CHECK:       2:
    658 // CHECK:       3: A g;
    659 // CHECK:       4: [B1.3].~A() (Implicit destructor)
    660 // CHECK:       5: [B2.2].~A() (Implicit destructor)
    661 // CHECK:     Predecessors (3): B3 B7 B2
    662 // CHECK:     Successors (1): B0
    663 // CHECK:  [ B2 ]
    664 // CHECK:       1:
    665 // CHECK:       2: A a;
    666 // CHECK:       3: a
    667 // CHECK:       4: [B2.3]
    668 // CHECK:       5: [B2.4]
    669 // CHECK:       6: A b = a;
    670 // CHECK:       7: b
    671 // CHECK:       8: [B2.7]
    672 // CHECK:       9: [B2.8].operator int
    673 // CHECK:      10: [B2.9]()
    674 // CHECK:       T: switch [B2.10]
    675 // CHECK:     Predecessors (1): B9
    676 // CHECK:     Successors (3): B3 B8
    677 // CHECK:      B1
    678 // CHECK:  [ B3 ]
    679 // CHECK:     case 1:
    680 // CHECK:       T: break;
    681 // CHECK:     Predecessors (2): B2 B4
    682 // CHECK:     Successors (1): B1
    683 // CHECK:  [ B4 ]
    684 // CHECK:       1:
    685 // CHECK:       2: A f;
    686 // CHECK:       3: [B4.2].~A() (Implicit destructor)
    687 // CHECK:       4: [B8.2].~A() (Implicit destructor)
    688 // CHECK:     Predecessors (1): B6
    689 // CHECK:     Successors (1): B3
    690 // CHECK:  [ B5 ]
    691 // CHECK:       1: return;
    692 // CHECK:       2: [B8.2].~A() (Implicit destructor)
    693 // CHECK:       3: [B2.6].~A() (Implicit destructor)
    694 // CHECK:       4: [B2.2].~A() (Implicit destructor)
    695 // CHECK:     Predecessors (1): B6
    696 // CHECK:     Successors (1): B0
    697 // CHECK:  [ B6 ]
    698 // CHECK:       1: UV
    699 // CHECK:       2: [B6.1]
    700 // CHECK:       T: if [B6.2]
    701 // CHECK:     Predecessors (1): B8
    702 // CHECK:     Successors (2): B5 B4
    703 // CHECK:  [ B7 ]
    704 // CHECK:       1: [B8.2].~A() (Implicit destructor)
    705 // CHECK:       T: break;
    706 // CHECK:     Predecessors (1): B8
    707 // CHECK:     Successors (1): B1
    708 // CHECK:  [ B8 ]
    709 // CHECK:     case 0:
    710 // CHECK:       1:
    711 // CHECK:       2: A c;
    712 // CHECK:       3: UV
    713 // CHECK:       4: [B8.3]
    714 // CHECK:       T: if [B8.4]
    715 // CHECK:     Predecessors (1): B2
    716 // CHECK:     Successors (2): B7 B6
    717 // CHECK:  [ B0 (EXIT) ]
    718 // CHECK:     Predecessors (2): B1 B5
    719 // CHECK:     Successors (0):
    720 // CHECK:  [ B6 (ENTRY) ]
    721 // CHECK:     Predecessors (0):
    722 // CHECK:     Successors (1): B5
    723 // CHECK:  [ B1 ]
    724 // CHECK:       1: [B2.4].~A() (Implicit destructor)
    725 // CHECK:       2: [B5.2].~A() (Implicit destructor)
    726 // CHECK:     Predecessors (1): B2
    727 // CHECK:     Successors (1): B0
    728 // CHECK:  [ B2 ]
    729 // CHECK:       1: a
    730 // CHECK:       2: [B2.1]
    731 // CHECK:       3: [B2.2]
    732 // CHECK:       4: A b = a;
    733 // CHECK:       5: b
    734 // CHECK:       6: [B2.5]
    735 // CHECK:       7: [B2.6].operator int
    736 // CHECK:       8: [B2.7]()
    737 // CHECK:       9: [B2.8]
    738 // CHECK:       T: for (...; [B2.9]; )
    739 // CHECK:     Predecessors (2): B3 B5
    740 // CHECK:     Successors (2): B4 B1
    741 // CHECK:  [ B3 ]
    742 // CHECK:       1: [B2.4].~A() (Implicit destructor)
    743 // CHECK:     Predecessors (1): B4
    744 // CHECK:     Successors (1): B2
    745 // CHECK:  [ B4 ]
    746 // CHECK:       1:
    747 // CHECK:       2: A c;
    748 // CHECK:       3: [B4.2].~A() (Implicit destructor)
    749 // CHECK:     Predecessors (1): B2
    750 // CHECK:     Successors (1): B3
    751 // CHECK:  [ B5 ]
    752 // CHECK:       1:
    753 // CHECK:       2: A a;
    754 // CHECK:     Predecessors (1): B6
    755 // CHECK:     Successors (1): B2
    756 // CHECK:  [ B0 (EXIT) ]
    757 // CHECK:     Predecessors (1): B1
    758 // CHECK:     Successors (0):
    759 // CHECK:  [ B12 (ENTRY) ]
    760 // CHECK:     Predecessors (0):
    761 // CHECK:     Successors (1): B11
    762 // CHECK:  [ B1 ]
    763 // CHECK:       1: [B2.4].~A() (Implicit destructor)
    764 // CHECK:       2: [B11.4].~A() (Implicit destructor)
    765 // CHECK:       3:
    766 // CHECK:       4: A f;
    767 // CHECK:       5: [B1.4].~A() (Implicit destructor)
    768 // CHECK:       6: [B11.2].~A() (Implicit destructor)
    769 // CHECK:     Predecessors (2): B9 B2
    770 // CHECK:     Successors (1): B0
    771 // CHECK:  [ B2 ]
    772 // CHECK:       1: b
    773 // CHECK:       2: [B2.1]
    774 // CHECK:       3: [B2.2]
    775 // CHECK:       4: A c = b;
    776 // CHECK:       5: c
    777 // CHECK:       6: [B2.5]
    778 // CHECK:       7: [B2.6].operator int
    779 // CHECK:       8: [B2.7]()
    780 // CHECK:       9: [B2.8]
    781 // CHECK:       T: for (...; [B2.9]; )
    782 // CHECK:     Predecessors (2): B3 B11
    783 // CHECK:     Successors (2): B10 B1
    784 // CHECK:  [ B3 ]
    785 // CHECK:       1: [B2.4].~A() (Implicit destructor)
    786 // CHECK:     Predecessors (2): B4 B7
    787 // CHECK:     Successors (1): B2
    788 // CHECK:  [ B4 ]
    789 // CHECK:       1:
    790 // CHECK:       2: A e;
    791 // CHECK:       3: [B4.2].~A() (Implicit destructor)
    792 // CHECK:       4: [B10.2].~A() (Implicit destructor)
    793 // CHECK:     Predecessors (1): B6
    794 // CHECK:     Successors (1): B3
    795 // CHECK:  [ B5 ]
    796 // CHECK:       1: return;
    797 // CHECK:       2: [B10.2].~A() (Implicit destructor)
    798 // CHECK:       3: [B2.4].~A() (Implicit destructor)
    799 // CHECK:       4: [B11.4].~A() (Implicit destructor)
    800 // CHECK:       5: [B11.2].~A() (Implicit destructor)
    801 // CHECK:     Predecessors (1): B6
    802 // CHECK:     Successors (1): B0
    803 // CHECK:  [ B6 ]
    804 // CHECK:       1: UV
    805 // CHECK:       2: [B6.1]
    806 // CHECK:       T: if [B6.2]
    807 // CHECK:     Predecessors (1): B8
    808 // CHECK:     Successors (2): B5 B4
    809 // CHECK:  [ B7 ]
    810 // CHECK:       1: [B10.2].~A() (Implicit destructor)
    811 // CHECK:       T: continue;
    812 // CHECK:     Predecessors (1): B8
    813 // CHECK:     Successors (1): B3
    814 // CHECK:  [ B8 ]
    815 // CHECK:       1: UV
    816 // CHECK:       2: [B8.1]
    817 // CHECK:       T: if [B8.2]
    818 // CHECK:     Predecessors (1): B10
    819 // CHECK:     Successors (2): B7 B6
    820 // CHECK:  [ B9 ]
    821 // CHECK:       1: [B10.2].~A() (Implicit destructor)
    822 // CHECK:       T: break;
    823 // CHECK:     Predecessors (1): B10
    824 // CHECK:     Successors (1): B1
    825 // CHECK:  [ B10 ]
    826 // CHECK:       1:
    827 // CHECK:       2: A d;
    828 // CHECK:       3: UV
    829 // CHECK:       4: [B10.3]
    830 // CHECK:       T: if [B10.4]
    831 // CHECK:     Predecessors (1): B2
    832 // CHECK:     Successors (2): B9 B8
    833 // CHECK:  [ B11 ]
    834 // CHECK:       1:
    835 // CHECK:       2: A a;
    836 // CHECK:       3:
    837 // CHECK:       4: A b;
    838 // CHECK:     Predecessors (1): B12
    839 // CHECK:     Successors (1): B2
    840 // CHECK:  [ B0 (EXIT) ]
    841 // CHECK:     Predecessors (2): B1 B5
    842 // CHECK:     Successors (0):
    843 // CHECK:  [ B3 (ENTRY) ]
    844 // CHECK:     Predecessors (0):
    845 // CHECK:     Successors (1): B0
    846 // CHECK:  [ B1 ]
    847 // CHECK:       T: try ...
    848 // CHECK:     Predecessors (0):
    849 // CHECK:     Successors (2): B2 B0
    850 // CHECK:  [ B2 ]
    851 // CHECK:     catch (const A &e):
    852 // CHECK:     Predecessors (1): B1
    853 // CHECK:     Successors (1): B0
    854 // CHECK:  [ B0 (EXIT) ]
    855 // CHECK:     Predecessors (3): B2 B1 B3
    856 // CHECK:     Successors (0):
    857 // CHECK:  [ B3 (ENTRY) ]
    858 // CHECK:     Predecessors (0):
    859 // CHECK:     Successors (1): B0
    860 // CHECK:  [ B1 ]
    861 // CHECK:       T: try ...
    862 // CHECK:     Predecessors (0):
    863 // CHECK:     Successors (2): B2 B0
    864 // CHECK:  [ B2 ]
    865 // CHECK:     catch (A e):
    866 // CHECK:       1: .~A() (Implicit destructor)
    867 // CHECK:     Predecessors (1): B1
    868 // CHECK:     Successors (1): B0
    869 // CHECK:  [ B0 (EXIT) ]
    870 // CHECK:     Predecessors (3): B2 B1 B3
    871 // CHECK:     Successors (0):
    872 
    873