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) [B4.2]
    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) [B8.2]
    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) [B4.2]
    394 // CHECK:     Preds (2): B4 B5
    395 // CHECK:     Succs (2): B2 B1
    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) [B8.2]
    424 // CHECK:     Preds (2): B8 B9
    425 // CHECK:     Succs (2): B6 B5
    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) [B9.2]
    496 // CHECK:     Preds (2): B8 B9
    497 // CHECK:     Succs (2): B6 B5
    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:   [B2 (ENTRY)]
    537 // CHECK:     Succs (1): B1
    538 // CHECK:   [B1]
    539 // CHECK:     1: true
    540 // CHECK:     2: b_([B1.1]) (Member initializer)
    541 // CHECK:     Preds (1): B2
    542 // CHECK:     Succs (1): B0
    543 // CHECK:   [B0 (EXIT)]
    544 // CHECK:     Preds (1): B1
    545 // CHECK:   [B1 (ENTRY)]
    546 // CHECK:     Succs (1): B0
    547 // CHECK:   [B0 (EXIT)]
    548 // CHECK:     Preds (1): B1
    549 // CHECK:   [B2 (ENTRY)]
    550 // CHECK:     Succs (1): B1
    551 // CHECK:   [B1]
    552 // CHECK:     1: this
    553 // CHECK:     2: [B1.1]->b_
    554 // CHECK:     3: [B1.2] (ImplicitCastExpr, LValueToRValue, _Bool)
    555 // CHECK:     4: return [B1.3];
    556 // CHECK:     Preds (1): B2
    557 // CHECK:     Succs (1): B0
    558 // CHECK:   [B0 (EXIT)]
    559 // CHECK:     Preds (1): B1
    560 // CHECK:   [B2 (ENTRY)]
    561 // CHECK:     Succs (1): B1
    562 // CHECK:   [B1]
    563 // CHECK:     1: true
    564 // CHECK:     2: b_([B1.1]) (Member initializer)
    565 // CHECK:     Preds (1): B2
    566 // CHECK:     Succs (1): B0
    567 // CHECK:   [B0 (EXIT)]
    568 // CHECK:     Preds (1): B1
    569 // CHECK:   [B2 (ENTRY)]
    570 // CHECK:     Succs (1): B1
    571 // CHECK:   [B1]
    572 // CHECK:     1: this
    573 // CHECK:     2: [B1.1]->b_
    574 // CHECK:     3: [B1.2] (ImplicitCastExpr, LValueToRValue, _Bool)
    575 // CHECK:     4: return [B1.3];
    576 // CHECK:     Preds (1): B2
    577 // CHECK:     Succs (1): B0
    578 // CHECK:   [B0 (EXIT)]
    579 // CHECK:     Preds (1): B1
    580 // CHECK:   [B4 (ENTRY)]
    581 // CHECK:     Succs (1): B3
    582 // CHECK:   [B1]
    583 // CHECK:     1: 0
    584 // CHECK:     2: return [B1.1];
    585 // CHECK:     Preds (1): B3
    586 // CHECK:     Succs (1): B0
    587 // CHECK:   [B2]
    588 // CHECK:     1: 1
    589 // CHECK:     2: return [B2.1];
    590 // CHECK:     Preds (1): B3
    591 // CHECK:     Succs (1): B0
    592 // CHECK:   [B3]
    593 // CHECK:     1: C() (CXXConstructExpr, struct C)
    594 // CHECK:     2: [B3.1] (BindTemporary)
    595 // CHECK:     3: [B3.2].operator bool
    596 // CHECK:     4: [B3.2]
    597 // CHECK:     5: [B3.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
    598 // CHECK:     6: ~C() (Temporary object destructor)
    599 // CHECK:     T: if [B3.5]
    600 // CHECK:     Preds (1): B4
    601 // CHECK:     Succs (2): B2 B1
    602 // CHECK:   [B0 (EXIT)]
    603 // CHECK:     Preds (2): B1 B2
    604 // CHECK:   [B5 (ENTRY)]
    605 // CHECK:     Succs (1): B4
    606 // CHECK:   [B1]
    607 // CHECK:     1: [B4.6].~C() (Implicit destructor)
    608 // CHECK:     Succs (1): B0
    609 // CHECK:   [B2]
    610 // CHECK:     1: 0
    611 // CHECK:     2: return [B2.1];
    612 // CHECK:     3: [B4.6].~C() (Implicit destructor)
    613 // CHECK:     Preds (1): B4
    614 // CHECK:     Succs (1): B0
    615 // CHECK:   [B3]
    616 // CHECK:     1: 1
    617 // CHECK:     2: return [B3.1];
    618 // CHECK:     3: [B4.6].~C() (Implicit destructor)
    619 // CHECK:     Preds (1): B4
    620 // CHECK:     Succs (1): B0
    621 // CHECK:   [B4]
    622 // CHECK:     1: C() (CXXConstructExpr, struct C)
    623 // CHECK:     2: [B4.1] (BindTemporary)
    624 // CHECK:     3: [B4.2] (ImplicitCastExpr, NoOp, const struct C)
    625 // CHECK:     4: [B4.3]
    626 // CHECK:     5: [B4.4] (CXXConstructExpr, struct C)
    627 // CHECK:     6: C c = C();
    628 // CHECK:     7: ~C() (Temporary object destructor)
    629 // CHECK:     8: c
    630 // CHECK:     9: [B4.8].operator bool
    631 // CHECK:    10: [B4.8]
    632 // CHECK:    11: [B4.10] (ImplicitCastExpr, UserDefinedConversion, _Bool)
    633 // CHECK:     T: if [B4.11]
    634 // CHECK:     Preds (1): B5
    635 // CHECK:     Succs (2): B3 B2
    636 // CHECK:   [B0 (EXIT)]
    637 // CHECK:     Preds (3): B1 B2 B3
    638 // CHECK:   [B4 (ENTRY)]
    639 // CHECK:     Succs (1): B3
    640 // CHECK:   [B1]
    641 // CHECK:     1: 0
    642 // CHECK:     2: return [B1.1];
    643 // CHECK:     Preds (1): B3
    644 // CHECK:     Succs (1): B0
    645 // CHECK:   [B2]
    646 // CHECK:     1: 1
    647 // CHECK:     2: return [B2.1];
    648 // CHECK:     Preds (1): B3
    649 // CHECK:     Succs (1): B0
    650 // CHECK:   [B3]
    651 // CHECK:     1: D() (CXXConstructExpr, struct D)
    652 // CHECK:     2: [B3.1].operator bool
    653 // CHECK:     3: [B3.1]
    654 // CHECK:     4: [B3.3] (ImplicitCastExpr, UserDefinedConversion, _Bool)
    655 // CHECK:     T: if [B3.4]
    656 // CHECK:     Preds (1): B4
    657 // CHECK:     Succs (2): B2 B1
    658 // CHECK:   [B0 (EXIT)]
    659 // CHECK:     Preds (2): B1 B2
    660 // CHECK:   [B4 (ENTRY)]
    661 // CHECK:     Succs (1): B3
    662 // CHECK:   [B1]
    663 // CHECK:     1: 0
    664 // CHECK:     2: return [B1.1];
    665 // CHECK:     Preds (1): B3
    666 // CHECK:     Succs (1): B0
    667 // CHECK:   [B2]
    668 // CHECK:     1: 1
    669 // CHECK:     2: return [B2.1];
    670 // CHECK:     Preds (1): B3
    671 // CHECK:     Succs (1): B0
    672 // CHECK:   [B3]
    673 // CHECK:     1: D() (CXXConstructExpr, struct D)
    674 // CHECK:     2: [B3.1] (ImplicitCastExpr, NoOp, const struct D)
    675 // CHECK:     3: [B3.2]
    676 // CHECK:     4: [B3.3] (CXXConstructExpr, struct D)
    677 // CHECK:     5: D d = D();
    678 // CHECK:     6: d
    679 // CHECK:     7: [B3.6].operator bool
    680 // CHECK:     8: [B3.6]
    681 // CHECK:     9: [B3.8] (ImplicitCastExpr, UserDefinedConversion, _Bool)
    682 // CHECK:     T: if [B3.9]
    683 // CHECK:     Preds (1): B4
    684 // CHECK:     Succs (2): B2 B1
    685 // CHECK:   [B0 (EXIT)]
    686 // CHECK:     Preds (2): B1 B2
    687 // CHECK:   [B14 (ENTRY)]
    688 // CHECK:     Succs (1): B13
    689 // CHECK:   [B1]
    690 // CHECK:     1: ~B() (Temporary object destructor)
    691 // CHECK:     2: int b;
    692 // CHECK:     3: [B10.4].~A() (Implicit destructor)
    693 // CHECK:     Preds (2): B2 B3
    694 // CHECK:     Succs (1): B0
    695 // CHECK:   [B2]
    696 // CHECK:     1: ~A() (Temporary object destructor)
    697 // CHECK:     2: ~A() (Temporary object destructor)
    698 // CHECK:     Preds (1): B4
    699 // CHECK:     Succs (1): B1
    700 // CHECK:   [B3]
    701 // CHECK:     1: ~A() (Temporary object destructor)
    702 // CHECK:     2: ~A() (Temporary object destructor)
    703 // CHECK:     3: ~A() (Temporary object destructor)
    704 // CHECK:     4: ~B() (Temporary object destructor)
    705 // CHECK:     Preds (1): B4
    706 // CHECK:     Succs (1): B1
    707 // CHECK:   [B4]
    708 // CHECK:     1: [B7.8] ? [B5.6] : [B6.15]
    709 // CHECK:     2: [B4.1] (ImplicitCastExpr, NoOp, const class A)
    710 // CHECK:     3: [B4.2]
    711 // CHECK:     4: [B7.3]([B4.3])
    712 // CHECK:     T: (Temp Dtor) [B6.2]
    713 // CHECK:     Preds (2): B5 B6
    714 // CHECK:     Succs (2): B3 B2
    715 // CHECK:   [B5]
    716 // CHECK:     1: A() (CXXConstructExpr, class A)
    717 // CHECK:     2: [B5.1] (BindTemporary)
    718 // CHECK:     3: [B5.2] (ImplicitCastExpr, NoOp, const class A)
    719 // CHECK:     4: [B5.3]
    720 // CHECK:     5: [B5.4] (CXXConstructExpr, class A)
    721 // CHECK:     6: [B5.5] (BindTemporary)
    722 // CHECK:     Preds (1): B7
    723 // CHECK:     Succs (1): B4
    724 // CHECK:   [B6]
    725 // CHECK:     1: B() (CXXConstructExpr, class B)
    726 // CHECK:     2: [B6.1] (BindTemporary)
    727 // CHECK:     3: [B6.2].operator A
    728 // CHECK:     4: [B6.2]
    729 // CHECK:     5: [B6.4] (ImplicitCastExpr, UserDefinedConversion, class A)
    730 // CHECK:     6: [B6.5] (BindTemporary)
    731 // CHECK:     7: [B6.6] (ImplicitCastExpr, NoOp, const class A)
    732 // CHECK:     8: [B6.7]
    733 // CHECK:     9: [B6.8] (CXXConstructExpr, class A)
    734 // CHECK:    10: [B6.9] (BindTemporary)
    735 // CHECK:    11: A([B6.10]) (CXXFunctionalCastExpr, ConstructorConversion, class A)
    736 // CHECK:    12: [B6.11] (ImplicitCastExpr, NoOp, const class A)
    737 // CHECK:    13: [B6.12]
    738 // CHECK:    14: [B6.13] (CXXConstructExpr, class A)
    739 // CHECK:    15: [B6.14] (BindTemporary)
    740 // CHECK:     Preds (1): B7
    741 // CHECK:     Succs (1): B4
    742 // CHECK:   [B7]
    743 // CHECK:     1: ~B() (Temporary object destructor)
    744 // CHECK:     2: foo
    745 // CHECK:     3: [B7.2] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(const class A &))
    746 // CHECK:     4: B() (CXXConstructExpr, class B)
    747 // CHECK:     5: [B7.4] (BindTemporary)
    748 // CHECK:     6: [B7.5].operator bool
    749 // CHECK:     7: [B7.5]
    750 // CHECK:     8: [B7.7] (ImplicitCastExpr, UserDefinedConversion, _Bool)
    751 // CHECK:     T: [B7.8] ? ... : ...
    752 // CHECK:     Preds (2): B8 B9
    753 // CHECK:     Succs (2): B5 B6
    754 // CHECK:   [B8]
    755 // CHECK:     1: ~A() (Temporary object destructor)
    756 // CHECK:     Preds (1): B10
    757 // CHECK:     Succs (1): B7
    758 // CHECK:   [B9]
    759 // CHECK:     1: ~A() (Temporary object destructor)
    760 // CHECK:     2: ~A() (Temporary object destructor)
    761 // CHECK:     3: ~B() (Temporary object destructor)
    762 // CHECK:     Preds (1): B10
    763 // CHECK:     Succs (1): B7
    764 // CHECK:   [B10]
    765 // CHECK:     1: [B13.5] ? [B11.6] : [B12.15]
    766 // CHECK:     2: [B10.1] (ImplicitCastExpr, NoOp, const class A)
    767 // CHECK:     3: [B10.2]
    768 // CHECK:     4: const A &a = B() ? A() : A(B());
    769 // CHECK:     T: (Temp Dtor) [B12.2]
    770 // CHECK:     Preds (2): B11 B12
    771 // CHECK:     Succs (2): B9 B8
    772 // CHECK:   [B11]
    773 // CHECK:     1: A() (CXXConstructExpr, class A)
    774 // CHECK:     2: [B11.1] (BindTemporary)
    775 // CHECK:     3: [B11.2] (ImplicitCastExpr, NoOp, const class A)
    776 // CHECK:     4: [B11.3]
    777 // CHECK:     5: [B11.4] (CXXConstructExpr, class A)
    778 // CHECK:     6: [B11.5] (BindTemporary)
    779 // CHECK:     Preds (1): B13
    780 // CHECK:     Succs (1): B10
    781 // CHECK:   [B12]
    782 // CHECK:     1: B() (CXXConstructExpr, class B)
    783 // CHECK:     2: [B12.1] (BindTemporary)
    784 // CHECK:     3: [B12.2].operator A
    785 // CHECK:     4: [B12.2]
    786 // CHECK:     5: [B12.4] (ImplicitCastExpr, UserDefinedConversion, class A)
    787 // CHECK:     6: [B12.5] (BindTemporary)
    788 // CHECK:     7: [B12.6] (ImplicitCastExpr, NoOp, const class A)
    789 // CHECK:     8: [B12.7]
    790 // CHECK:     9: [B12.8] (CXXConstructExpr, class A)
    791 // CHECK:    10: [B12.9] (BindTemporary)
    792 // CHECK:    11: A([B12.10]) (CXXFunctionalCastExpr, ConstructorConversion, class A)
    793 // CHECK:    12: [B12.11] (ImplicitCastExpr, NoOp, const class A)
    794 // CHECK:    13: [B12.12]
    795 // CHECK:    14: [B12.13] (CXXConstructExpr, class A)
    796 // CHECK:    15: [B12.14] (BindTemporary)
    797 // CHECK:     Preds (1): B13
    798 // CHECK:     Succs (1): B10
    799 // CHECK:   [B13]
    800 // CHECK:     1: B() (CXXConstructExpr, class B)
    801 // CHECK:     2: [B13.1] (BindTemporary)
    802 // CHECK:     3: [B13.2].operator bool
    803 // CHECK:     4: [B13.2]
    804 // CHECK:     5: [B13.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
    805 // CHECK:     T: [B13.5] ? ... : ...
    806 // CHECK:     Preds (1): B14
    807 // CHECK:     Succs (2): B11 B12
    808 // CHECK:   [B0 (EXIT)]
    809 // CHECK:     Preds (1): B1
    810 // CHECK:   [B8 (ENTRY)]
    811 // CHECK:     Succs (1): B7
    812 // CHECK:   [B1]
    813 // CHECK:     1: int b;
    814 // CHECK:     2: [B4.5].~A() (Implicit destructor)
    815 // CHECK:     Preds (2): B2 B3
    816 // CHECK:     Succs (1): B0
    817 // CHECK:   [B2]
    818 // CHECK:     1: ~A() (Temporary object destructor)
    819 // CHECK:     Preds (1): B4
    820 // CHECK:     Succs (1): B1
    821 // CHECK:   [B3]
    822 // CHECK:     1: ~A() (Temporary object destructor)
    823 // CHECK:     2: ~A() (Temporary object destructor)
    824 // CHECK:     Preds (1): B4
    825 // CHECK:     Succs (1): B1
    826 // CHECK:   [B4]
    827 // CHECK:     1: [B7.2] ?: [B6.6]
    828 // CHECK:     2: [B4.1] (ImplicitCastExpr, NoOp, const class A)
    829 // CHECK:     3: [B4.2]
    830 // CHECK:     4: [B4.3] (CXXConstructExpr, class A)
    831 // CHECK:     5: A a = A() ?: A();
    832 // CHECK:     T: (Temp Dtor) [B6.2]
    833 // CHECK:     Preds (2): B5 B6
    834 // CHECK:     Succs (2): B3 B2
    835 // CHECK:   [B5]
    836 // CHECK:     1: [B7.2] (ImplicitCastExpr, NoOp, const class A)
    837 // CHECK:     2: [B5.1]
    838 // CHECK:     3: [B5.2] (CXXConstructExpr, class A)
    839 // CHECK:     4: [B5.3] (BindTemporary)
    840 // CHECK:     Preds (1): B7
    841 // CHECK:     Succs (1): B4
    842 // CHECK:   [B6]
    843 // CHECK:     1: A() (CXXConstructExpr, class A)
    844 // CHECK:     2: [B6.1] (BindTemporary)
    845 // CHECK:     3: [B6.2] (ImplicitCastExpr, NoOp, const class A)
    846 // CHECK:     4: [B6.3]
    847 // CHECK:     5: [B6.4] (CXXConstructExpr, class A)
    848 // CHECK:     6: [B6.5] (BindTemporary)
    849 // CHECK:     Preds (1): B7
    850 // CHECK:     Succs (1): B4
    851 // CHECK:   [B7]
    852 // CHECK:     1: A() (CXXConstructExpr, class A)
    853 // CHECK:     2: [B7.1] (BindTemporary)
    854 // CHECK:     3: [B7.2].operator bool
    855 // CHECK:     4: [B7.2]
    856 // CHECK:     5: [B7.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
    857 // CHECK:     T: [B7.5] ? ... : ...
    858 // CHECK:     Preds (1): B8
    859 // CHECK:     Succs (2): B5 B6
    860 // CHECK:   [B0 (EXIT)]
    861 // CHECK:     Preds (1): B1
    862 // CHECK:   [B13 (ENTRY)]
    863 // CHECK:     Succs (1): B12
    864 // CHECK:   [B1]
    865 // CHECK:     1: int b;
    866 // CHECK:     2: [B9.4].~A() (Implicit destructor)
    867 // CHECK:     Preds (2): B2 B3
    868 // CHECK:     Succs (1): B0
    869 // CHECK:   [B2]
    870 // CHECK:     1: ~A() (Temporary object destructor)
    871 // CHECK:     Preds (1): B4
    872 // CHECK:     Succs (1): B1
    873 // CHECK:   [B3]
    874 // CHECK:     1: ~A() (Temporary object destructor)
    875 // CHECK:     2: ~A() (Temporary object destructor)
    876 // CHECK:     Preds (1): B4
    877 // CHECK:     Succs (1): B1
    878 // CHECK:   [B4]
    879 // CHECK:     1: [B7.4] ?: [B6.6]
    880 // CHECK:     2: [B4.1] (ImplicitCastExpr, NoOp, const class A)
    881 // CHECK:     3: [B4.2]
    882 // CHECK:     4: [B7.2]([B4.3])
    883 // CHECK:     T: (Temp Dtor) [B6.2]
    884 // CHECK:     Preds (2): B5 B6
    885 // CHECK:     Succs (2): B3 B2
    886 // CHECK:   [B5]
    887 // CHECK:     1: [B7.4] (ImplicitCastExpr, NoOp, const class A)
    888 // CHECK:     2: [B5.1]
    889 // CHECK:     3: [B5.2] (CXXConstructExpr, class A)
    890 // CHECK:     4: [B5.3] (BindTemporary)
    891 // CHECK:     Preds (1): B7
    892 // CHECK:     Succs (1): B4
    893 // CHECK:   [B6]
    894 // CHECK:     1: A() (CXXConstructExpr, class A)
    895 // CHECK:     2: [B6.1] (BindTemporary)
    896 // CHECK:     3: [B6.2] (ImplicitCastExpr, NoOp, const class A)
    897 // CHECK:     4: [B6.3]
    898 // CHECK:     5: [B6.4] (CXXConstructExpr, class A)
    899 // CHECK:     6: [B6.5] (BindTemporary)
    900 // CHECK:     Preds (1): B7
    901 // CHECK:     Succs (1): B4
    902 // CHECK:   [B7]
    903 // CHECK:     1: foo
    904 // CHECK:     2: [B7.1] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(const class A &))
    905 // CHECK:     3: A() (CXXConstructExpr, class A)
    906 // CHECK:     4: [B7.3] (BindTemporary)
    907 // CHECK:     5: [B7.4].operator bool
    908 // CHECK:     6: [B7.4]
    909 // CHECK:     7: [B7.6] (ImplicitCastExpr, UserDefinedConversion, _Bool)
    910 // CHECK:     T: [B7.7] ? ... : ...
    911 // CHECK:     Preds (2): B8 B9
    912 // CHECK:     Succs (2): B5 B6
    913 // CHECK:   [B8]
    914 // CHECK:     1: ~A() (Temporary object destructor)
    915 // CHECK:     Preds (1): B9
    916 // CHECK:     Succs (1): B7
    917 // CHECK:   [B9]
    918 // CHECK:     1: [B12.2] ?: [B11.6]
    919 // CHECK:     2: [B9.1] (ImplicitCastExpr, NoOp, const class A)
    920 // CHECK:     3: [B9.2]
    921 // CHECK:     4: const A &a = A() ?: A();
    922 // CHECK:     T: (Temp Dtor) [B11.2]
    923 // CHECK:     Preds (2): B10 B11
    924 // CHECK:     Succs (2): B8 B7
    925 // CHECK:   [B10]
    926 // CHECK:     1: [B12.2] (ImplicitCastExpr, NoOp, const class A)
    927 // CHECK:     2: [B10.1]
    928 // CHECK:     3: [B10.2] (CXXConstructExpr, class A)
    929 // CHECK:     4: [B10.3] (BindTemporary)
    930 // CHECK:     Preds (1): B12
    931 // CHECK:     Succs (1): B9
    932 // CHECK:   [B11]
    933 // CHECK:     1: A() (CXXConstructExpr, class A)
    934 // CHECK:     2: [B11.1] (BindTemporary)
    935 // CHECK:     3: [B11.2] (ImplicitCastExpr, NoOp, const class A)
    936 // CHECK:     4: [B11.3]
    937 // CHECK:     5: [B11.4] (CXXConstructExpr, class A)
    938 // CHECK:     6: [B11.5] (BindTemporary)
    939 // CHECK:     Preds (1): B12
    940 // CHECK:     Succs (1): B9
    941 // CHECK:   [B12]
    942 // CHECK:     1: A() (CXXConstructExpr, class A)
    943 // CHECK:     2: [B12.1] (BindTemporary)
    944 // CHECK:     3: [B12.2].operator bool
    945 // CHECK:     4: [B12.2]
    946 // CHECK:     5: [B12.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
    947 // CHECK:     T: [B12.5] ? ... : ...
    948 // CHECK:     Preds (1): B13
    949 // CHECK:     Succs (2): B10 B11
    950 // CHECK:   [B0 (EXIT)]
    951 // CHECK:     Preds (1): B1
    952 // CHECK:   [B2 (ENTRY)]
    953 // CHECK:     Succs (1): B1
    954 // CHECK:   [B1]
    955 // CHECK:     1: A() (CXXConstructExpr, class A)
    956 // CHECK:     2: [B1.1] (BindTemporary)
    957 // CHECK:     3: [B1.2] (ImplicitCastExpr, NoOp, const class A)
    958 // CHECK:     4: [B1.3]
    959 // CHECK:     5: [B1.4] (CXXConstructExpr, class A)
    960 // CHECK:     6: A a = A();
    961 // CHECK:     7: ~A() (Temporary object destructor)
    962 // CHECK:     8: int b;
    963 // CHECK:     9: [B1.6].~A() (Implicit destructor)
    964 // CHECK:     Preds (1): B2
    965 // CHECK:     Succs (1): B0
    966 // CHECK:   [B0 (EXIT)]
    967 // CHECK:     Preds (1): B1
    968 // CHECK:   [B2 (ENTRY)]
    969 // CHECK:     Succs (1): B1
    970 // CHECK:   [B1]
    971 // CHECK:     1: A() (CXXConstructExpr, class A)
    972 // CHECK:     2: [B1.1] (BindTemporary)
    973 // CHECK:     3: [B1.2] (ImplicitCastExpr, NoOp, const class A)
    974 // CHECK:     4: [B1.3]
    975 // CHECK:     5: const A &a = A();
    976 // CHECK:     6: foo
    977 // CHECK:     7: [B1.6] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(const class A &))
    978 // CHECK:     8: A() (CXXConstructExpr, class A)
    979 // CHECK:     9: [B1.8] (BindTemporary)
    980 // CHECK:    10: [B1.9] (ImplicitCastExpr, NoOp, const class A)
    981 // CHECK:    11: [B1.10]
    982 // CHECK:    12: [B1.7]([B1.11])
    983 // CHECK:    13: ~A() (Temporary object destructor)
    984 // CHECK:    14: int b;
    985 // CHECK:    15: [B1.5].~A() (Implicit destructor)
    986 // CHECK:     Preds (1): B2
    987 // CHECK:     Succs (1): B0
    988 // CHECK:   [B0 (EXIT)]
    989 // CHECK:     Preds (1): B1
    990 // CHECK:   [B2 (ENTRY)]
    991 // CHECK:     Succs (1): B1
    992 // CHECK:   [B1]
    993 // CHECK:     1: A::make
    994 // CHECK:     2: [B1.1] (ImplicitCastExpr, FunctionToPointerDecay, class A (*)(void))
    995 // CHECK:     3: [B1.2]()
    996 // CHECK:     4: [B1.3] (BindTemporary)
    997 // CHECK:     5: [B1.4] (ImplicitCastExpr, NoOp, const class A)
    998 // CHECK:     6: [B1.5]
    999 // CHECK:     7: [B1.6] (CXXConstructExpr, class A)
   1000 // CHECK:     8: A a = A::make();
   1001 // CHECK:     9: ~A() (Temporary object destructor)
   1002 // CHECK:    10: int b;
   1003 // CHECK:    11: [B1.8].~A() (Implicit destructor)
   1004 // CHECK:     Preds (1): B2
   1005 // CHECK:     Succs (1): B0
   1006 // CHECK:   [B0 (EXIT)]
   1007 // CHECK:     Preds (1): B1
   1008 // CHECK:   [B2 (ENTRY)]
   1009 // CHECK:     Succs (1): B1
   1010 // CHECK:   [B1]
   1011 // CHECK:     1: A::make
   1012 // CHECK:     2: [B1.1] (ImplicitCastExpr, FunctionToPointerDecay, class A (*)(void))
   1013 // CHECK:     3: [B1.2]()
   1014 // CHECK:     4: [B1.3] (BindTemporary)
   1015 // CHECK:     5: [B1.4] (ImplicitCastExpr, NoOp, const class A)
   1016 // CHECK:     6: [B1.5]
   1017 // CHECK:     7: const A &a = A::make();
   1018 // CHECK:     8: foo
   1019 // CHECK:     9: [B1.8] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(const class A &))
   1020 // CHECK:    10: A::make
   1021 // CHECK:    11: [B1.10] (ImplicitCastExpr, FunctionToPointerDecay, class A (*)(void))
   1022 // CHECK:    12: [B1.11]()
   1023 // CHECK:    13: [B1.12] (BindTemporary)
   1024 // CHECK:    14: [B1.13] (ImplicitCastExpr, NoOp, const class A)
   1025 // CHECK:    15: [B1.14]
   1026 // CHECK:    16: [B1.9]([B1.15])
   1027 // CHECK:    17: ~A() (Temporary object destructor)
   1028 // CHECK:    18: int b;
   1029 // CHECK:    19: [B1.7].~A() (Implicit destructor)
   1030 // CHECK:     Preds (1): B2
   1031 // CHECK:     Succs (1): B0
   1032 // CHECK:   [B0 (EXIT)]
   1033 // CHECK:     Preds (1): B1
   1034 // CHECK:   [B2 (ENTRY)]
   1035 // CHECK:     Succs (1): B1
   1036 // CHECK:   [B1]
   1037 // CHECK:     1: int a;
   1038 // CHECK:     2: A() (CXXConstructExpr, class A)
   1039 // CHECK:     3: [B1.2] (BindTemporary)
   1040 // CHECK:     4: [B1.3].operator int
   1041 // CHECK:     5: [B1.3]
   1042 // CHECK:     6: [B1.5] (ImplicitCastExpr, UserDefinedConversion, int)
   1043 // CHECK:     7: a
   1044 // CHECK:     8: [B1.7] = [B1.6]
   1045 // CHECK:     9: ~A() (Temporary object destructor)
   1046 // CHECK:    10: int b;
   1047 // CHECK:     Preds (1): B2
   1048 // CHECK:     Succs (1): B0
   1049 // CHECK:   [B0 (EXIT)]
   1050 // CHECK:     Preds (1): B1
   1051 // CHECK:   [B2 (ENTRY)]
   1052 // CHECK:     Succs (1): B1
   1053 // CHECK:   [B1]
   1054 // CHECK:     1: A() (CXXConstructExpr, class A)
   1055 // CHECK:     2: [B1.1] (BindTemporary)
   1056 // CHECK:     3: [B1.2].operator int
   1057 // CHECK:     4: [B1.2]
   1058 // CHECK:     5: [B1.4] (ImplicitCastExpr, UserDefinedConversion, int)
   1059 // CHECK:     6: int([B1.5]) (CXXFunctionalCastExpr, NoOp, int)
   1060 // CHECK:     7: B() (CXXConstructExpr, class B)
   1061 // CHECK:     8: [B1.7] (BindTemporary)
   1062 // CHECK:     9: [B1.8].operator int
   1063 // CHECK:    10: [B1.8]
   1064 // CHECK:    11: [B1.10] (ImplicitCastExpr, UserDefinedConversion, int)
   1065 // CHECK:    12: int([B1.11]) (CXXFunctionalCastExpr, NoOp, int)
   1066 // CHECK:    13: [B1.6] + [B1.12]
   1067 // CHECK:    14: a([B1.13]) (Member initializer)
   1068 // CHECK:    15: ~B() (Temporary object destructor)
   1069 // CHECK:    16: ~A() (Temporary object destructor)
   1070 // CHECK:    17: /*implicit*/int()
   1071 // CHECK:    18: b([B1.17]) (Member initializer)
   1072 // CHECK:     Preds (1): B2
   1073 // CHECK:     Succs (1): B0
   1074 // CHECK:   [B0 (EXIT)]
   1075 // CHECK:     Preds (1): B1
   1076 // CHECK:   [B3 (ENTRY)]
   1077 // CHECK:     Succs (1): B2
   1078 // CHECK:   [B1]
   1079 // CHECK:     1: int b;
   1080 // CHECK:     Preds (1): B2(Unreachable)
   1081 // CHECK:     Succs (1): B0
   1082 // CHECK:   [B2 (NORETURN)]
   1083 // CHECK:     1: int a;
   1084 // CHECK:     2: NoReturn() (CXXConstructExpr, class NoReturn)
   1085 // CHECK:     3: [B2.2] (BindTemporary)
   1086 // CHECK:     4: [B2.3].f
   1087 // CHECK:     5: [B2.4]()
   1088 // CHECK:     6: ~NoReturn() (Temporary object destructor)
   1089 // CHECK:     Preds (1): B3
   1090 // CHECK:     Succs (1): B0
   1091 // CHECK:   [B0 (EXIT)]
   1092 // CHECK:     Preds (2): B1 B2
   1093 // CHECK:   [B3 (ENTRY)]
   1094 // CHECK:     Succs (1): B2
   1095 // CHECK:   [B1]
   1096 // CHECK:     1: int b;
   1097 // CHECK:     Preds (1): B2(Unreachable)
   1098 // CHECK:     Succs (1): B0
   1099 // CHECK:   [B2 (NORETURN)]
   1100 // CHECK:     1: int a;
   1101 // CHECK:     2: NoReturn() (CXXConstructExpr, class NoReturn)
   1102 // CHECK:     3: [B2.2] (BindTemporary)
   1103 // CHECK:     4: 47
   1104 // CHECK:     5: ... , [B2.4]
   1105 // CHECK:     6: ~NoReturn() (Temporary object destructor)
   1106 // CHECK:     Preds (1): B3
   1107 // CHECK:     Succs (1): B0
   1108 // CHECK:   [B0 (EXIT)]
   1109 // CHECK:     Preds (2): B1 B2
   1110 // CHECK:   [B9 (ENTRY)]
   1111 // CHECK:     Succs (1): B8
   1112 // CHECK:   [B1]
   1113 // CHECK:     1: 0
   1114 // CHECK:     2: return [B1.1];
   1115 // CHECK:     Preds (2): B3 B8
   1116 // CHECK:     Succs (1): B0
   1117 // CHECK:   [B2]
   1118 // CHECK:     1: 1
   1119 // CHECK:     2: return [B2.1];
   1120 // CHECK:     Preds (1): B3
   1121 // CHECK:     Succs (1): B0
   1122 // CHECK:   [B3]
   1123 // CHECK:     T: if [B5.1]
   1124 // CHECK:     Preds (2): B4(Unreachable) B5
   1125 // CHECK:     Succs (2): B2 B1
   1126 // CHECK:   [B4 (NORETURN)]
   1127 // CHECK:     1: ~NoReturn() (Temporary object destructor)
   1128 // CHECK:     Preds (1): B5
   1129 // CHECK:     Succs (1): B0
   1130 // CHECK:   [B5]
   1131 // CHECK:     1: [B7.3] || [B6.7]
   1132 // CHECK:     T: (Temp Dtor) [B6.4]
   1133 // CHECK:     Preds (2): B6 B7
   1134 // CHECK:     Succs (2): B4 B3
   1135 // CHECK:   [B6]
   1136 // CHECK:     1: check
   1137 // CHECK:     2: [B6.1] (ImplicitCastExpr, FunctionToPointerDecay, _Bool (*)(const class NoReturn &))
   1138 // CHECK:     3: NoReturn() (CXXConstructExpr, class NoReturn)
   1139 // CHECK:     4: [B6.3] (BindTemporary)
   1140 // CHECK:     5: [B6.4] (ImplicitCastExpr, NoOp, const class NoReturn)
   1141 // CHECK:     6: [B6.5]
   1142 // CHECK:     7: [B6.2]([B6.6])
   1143 // CHECK:     Preds (1): B7
   1144 // CHECK:     Succs (1): B5
   1145 // CHECK:   [B7]
   1146 // CHECK:     1: value
   1147 // CHECK:     2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)
   1148 // CHECK:     3: ![B7.2]
   1149 // CHECK:     T: [B7.3] || ...
   1150 // CHECK:     Preds (1): B8
   1151 // CHECK:     Succs (2): B5 B6
   1152 // CHECK:   [B8]
   1153 // CHECK:     1: value
   1154 // CHECK:     2: [B8.1] (ImplicitCastExpr, LValueToRValue, _Bool)
   1155 // CHECK:     T: if [B8.2]
   1156 // CHECK:     Preds (1): B9
   1157 // CHECK:     Succs (2): B7 B1
   1158 // CHECK:   [B0 (EXIT)]
   1159 // CHECK:     Preds (3): B1 B2 B4
   1160 // CHECK:   [B10 (ENTRY)]
   1161 // CHECK:     Succs (1): B9
   1162 // CHECK:   [B1]
   1163 // CHECK:     1: 0
   1164 // CHECK:     2: return [B1.1];
   1165 // CHECK:     Preds (2): B3 B9
   1166 // CHECK:     Succs (1): B0
   1167 // CHECK:   [B2]
   1168 // CHECK:     1: 1
   1169 // CHECK:     2: return [B2.1];
   1170 // CHECK:     Preds (1): B3
   1171 // CHECK:     Succs (1): B0
   1172 // CHECK:   [B3]
   1173 // CHECK:     T: if [B5.1]
   1174 // CHECK:     Preds (2): B4(Unreachable) B5
   1175 // CHECK:     Succs (2): B2 B1
   1176 // CHECK:   [B4 (NORETURN)]
   1177 // CHECK:     1: ~NoReturn() (Temporary object destructor)
   1178 // CHECK:     Preds (1): B5
   1179 // CHECK:     Succs (1): B0
   1180 // CHECK:   [B5]
   1181 // CHECK:     1: [B8.3] || [B7.3] || [B6.7]
   1182 // CHECK:     T: (Temp Dtor) [B6.4]
   1183 // CHECK:     Preds (3): B6 B7 B8
   1184 // CHECK:     Succs (2): B4 B3
   1185 // CHECK:   [B6]
   1186 // CHECK:     1: check
   1187 // CHECK:     2: [B6.1] (ImplicitCastExpr, FunctionToPointerDecay, _Bool (*)(const class NoReturn &))
   1188 // CHECK:     3: NoReturn() (CXXConstructExpr, class NoReturn)
   1189 // CHECK:     4: [B6.3] (BindTemporary)
   1190 // CHECK:     5: [B6.4] (ImplicitCastExpr, NoOp, const class NoReturn)
   1191 // CHECK:     6: [B6.5]
   1192 // CHECK:     7: [B6.2]([B6.6])
   1193 // CHECK:     Preds (1): B7
   1194 // CHECK:     Succs (1): B5
   1195 // CHECK:   [B7]
   1196 // CHECK:     1: value
   1197 // CHECK:     2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)
   1198 // CHECK:     3: ![B7.2]
   1199 // CHECK:     T: [B8.3] || [B7.3] || ...
   1200 // CHECK:     Preds (1): B8
   1201 // CHECK:     Succs (2): B5 B6
   1202 // CHECK:   [B8]
   1203 // CHECK:     1: value
   1204 // CHECK:     2: [B8.1] (ImplicitCastExpr, LValueToRValue, _Bool)
   1205 // CHECK:     3: ![B8.2]
   1206 // CHECK:     T: [B8.3] || ...
   1207 // CHECK:     Preds (1): B9
   1208 // CHECK:     Succs (2): B5 B7
   1209 // CHECK:   [B9]
   1210 // CHECK:     1: value
   1211 // CHECK:     2: [B9.1] (ImplicitCastExpr, LValueToRValue, _Bool)
   1212 // CHECK:     T: if [B9.2]
   1213 // CHECK:     Preds (1): B10
   1214 // CHECK:     Succs (2): B8 B1
   1215 // CHECK:   [B0 (EXIT)]
   1216 // CHECK:     Preds (3): B1 B2 B4
   1217 // CHECK:   [B10 (ENTRY)]
   1218 // CHECK:     Succs (1): B9
   1219 // CHECK:   [B1]
   1220 // CHECK:     1: 0
   1221 // CHECK:     2: return [B1.1];
   1222 // CHECK:     Preds (2): B3 B9
   1223 // CHECK:     Succs (1): B0
   1224 // CHECK:   [B2]
   1225 // CHECK:     1: 1
   1226 // CHECK:     2: return [B2.1];
   1227 // CHECK:     Preds (1): B3
   1228 // CHECK:     Succs (1): B0
   1229 // CHECK:   [B3]
   1230 // CHECK:     T: if [B5.1]
   1231 // CHECK:     Preds (2): B4(Unreachable) B5
   1232 // CHECK:     Succs (2): B2 B1
   1233 // CHECK:   [B4 (NORETURN)]
   1234 // CHECK:     1: ~NoReturn() (Temporary object destructor)
   1235 // CHECK:     Preds (1): B5
   1236 // CHECK:     Succs (1): B0
   1237 // CHECK:   [B5]
   1238 // CHECK:     1: [B8.3] || [B7.2] || [B6.7]
   1239 // CHECK:     T: (Temp Dtor) [B6.4]
   1240 // CHECK:     Preds (3): B6 B7 B8
   1241 // CHECK:     Succs (2): B4 B3
   1242 // CHECK:   [B6]
   1243 // CHECK:     1: check
   1244 // CHECK:     2: [B6.1] (ImplicitCastExpr, FunctionToPointerDecay, _Bool (*)(const class NoReturn &))
   1245 // CHECK:     3: NoReturn() (CXXConstructExpr, class NoReturn)
   1246 // CHECK:     4: [B6.3] (BindTemporary)
   1247 // CHECK:     5: [B6.4] (ImplicitCastExpr, NoOp, const class NoReturn)
   1248 // CHECK:     6: [B6.5]
   1249 // CHECK:     7: [B6.2]([B6.6])
   1250 // CHECK:     Preds (1): B7
   1251 // CHECK:     Succs (1): B5
   1252 // CHECK:   [B7]
   1253 // CHECK:     1: value
   1254 // CHECK:     2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)
   1255 // CHECK:     T: [B8.3] || [B7.2] || ...
   1256 // CHECK:     Preds (1): B8
   1257 // CHECK:     Succs (2): B5 B6
   1258 // CHECK:   [B8]
   1259 // CHECK:     1: value
   1260 // CHECK:     2: [B8.1] (ImplicitCastExpr, LValueToRValue, _Bool)
   1261 // CHECK:     3: ![B8.2]
   1262 // CHECK:     T: [B8.3] || ...
   1263 // CHECK:     Preds (1): B9
   1264 // CHECK:     Succs (2): B5 B7
   1265 // CHECK:   [B9]
   1266 // CHECK:     1: value
   1267 // CHECK:     2: [B9.1] (ImplicitCastExpr, LValueToRValue, _Bool)
   1268 // CHECK:     T: if [B9.2]
   1269 // CHECK:     Preds (1): B10
   1270 // CHECK:     Succs (2): B8 B1
   1271 // CHECK:   [B0 (EXIT)]
   1272 // CHECK:     Preds (3): B1 B2 B4
   1273