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