| // RUN: %clang_cc1 -analyze -cfg-dump -cfg-add-implicit-dtors %s 2>&1 | FileCheck %s |
| // XPASS: * |
| |
| class A { |
| public: |
| A() {} |
| ~A() {} |
| operator int() const { return 1; } |
| }; |
| |
| extern const bool UV; |
| |
| void test_const_ref() { |
| A a; |
| const A& b = a; |
| const A& c = A(); |
| } |
| |
| void test_scope() { |
| A a; |
| { A c; |
| A d; |
| } |
| A b; |
| } |
| |
| void test_return() { |
| A a; |
| A b; |
| if (UV) return; |
| A c; |
| } |
| |
| void test_goto() { |
| A a; |
| l0: |
| A b; |
| { A a; |
| if (UV) goto l0; |
| if (UV) goto l1; |
| A b; |
| } |
| l1: |
| A c; |
| } |
| |
| void test_if_implicit_scope() { |
| A a; |
| if (A b = a) |
| A c; |
| else A c; |
| } |
| |
| void test_if_jumps() { |
| A a; |
| if (A b = a) { |
| A c; |
| if (UV) return; |
| A d; |
| } else { |
| A c; |
| if (UV) return; |
| A d; |
| } |
| A e; |
| } |
| |
| void test_while_implicit_scope() { |
| A a; |
| while (A b = a) |
| A c; |
| } |
| |
| void test_while_jumps() { |
| A a; |
| while (A b = a) { |
| A c; |
| if (UV) break; |
| if (UV) continue; |
| if (UV) return; |
| A d; |
| } |
| A e; |
| } |
| |
| void test_do_implicit_scope() { |
| do A a; |
| while (UV); |
| } |
| |
| void test_do_jumps() { |
| A a; |
| do { |
| A b; |
| if (UV) break; |
| if (UV) continue; |
| if (UV) return; |
| A c; |
| } while (UV); |
| A d; |
| } |
| |
| void test_switch_implicit_scope() { |
| A a; |
| switch (A b = a) |
| A c; |
| } |
| |
| void test_switch_jumps() { |
| A a; |
| switch (A b = a) { |
| case 0: { |
| A c; |
| if (UV) break; |
| if (UV) return; |
| A f; |
| } |
| case 1: |
| break; |
| } |
| A g; |
| } |
| |
| void test_for_implicit_scope() { |
| for (A a; A b = a; ) |
| A c; |
| } |
| |
| void test_for_jumps() { |
| A a; |
| for (A b; A c = b; ) { |
| A d; |
| if (UV) break; |
| if (UV) continue; |
| if (UV) return; |
| A e; |
| } |
| A f; |
| } |
| |
| void test_catch_const_ref() { |
| try { |
| } catch (const A& e) { |
| } |
| } |
| |
| void test_catch_copy() { |
| try { |
| } catch (A e) { |
| } |
| } |
| |
| // CHECK: [ B2 (ENTRY) ] |
| // CHECK: Predecessors (0): |
| // CHECK: Successors (1): B1 |
| // CHECK: [ B1 ] |
| // CHECK: 1: A a; |
| // CHECK: 2: const A &b = a; |
| // CHECK: 3: const A &c = A(); |
| // CHECK: 4: [B1.3].~A() (Implicit destructor) |
| // CHECK: 5: [B1.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (1): B2 |
| // CHECK: Successors (1): B0 |
| // CHECK: [ B0 (EXIT) ] |
| // CHECK: Predecessors (1): B1 |
| // CHECK: Successors (0): |
| // CHECK: [ B2 (ENTRY) ] |
| // CHECK: Predecessors (0): |
| // CHECK: Successors (1): B1 |
| // CHECK: [ B1 ] |
| // CHECK: 1: A a; |
| // CHECK: 2: A c; |
| // CHECK: 3: A d; |
| // CHECK: 4: [B1.3].~A() (Implicit destructor) |
| // CHECK: 5: [B1.2].~A() (Implicit destructor) |
| // CHECK: 6: A b; |
| // CHECK: 7: [B1.6].~A() (Implicit destructor) |
| // CHECK: 8: [B1.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (1): B2 |
| // CHECK: Successors (1): B0 |
| // CHECK: [ B0 (EXIT) ] |
| // CHECK: Predecessors (1): B1 |
| // CHECK: Successors (0): |
| // CHECK: [ B4 (ENTRY) ] |
| // CHECK: Predecessors (0): |
| // CHECK: Successors (1): B3 |
| // CHECK: [ B1 ] |
| // CHECK: 1: A c; |
| // CHECK: 2: [B1.1].~A() (Implicit destructor) |
| // CHECK: 3: [B3.2].~A() (Implicit destructor) |
| // CHECK: 4: [B3.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (1): B3 |
| // CHECK: Successors (1): B0 |
| // CHECK: [ B2 ] |
| // CHECK: 1: return; |
| // CHECK: 2: [B3.2].~A() (Implicit destructor) |
| // CHECK: 3: [B3.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (1): B3 |
| // CHECK: Successors (1): B0 |
| // CHECK: [ B3 ] |
| // CHECK: 1: A a; |
| // CHECK: 2: A b; |
| // CHECK: 3: UV |
| // CHECK: T: if [B3.3] |
| // CHECK: Predecessors (1): B4 |
| // CHECK: Successors (2): B2 B1 |
| // CHECK: [ B0 (EXIT) ] |
| // CHECK: Predecessors (2): B1 B2 |
| // CHECK: Successors (0): |
| // CHECK: [ B8 (ENTRY) ] |
| // CHECK: Predecessors (0): |
| // CHECK: Successors (1): B7 |
| // CHECK: [ B1 ] |
| // CHECK: l1: |
| // CHECK: 1: A c; |
| // CHECK: 2: [B1.1].~A() (Implicit destructor) |
| // CHECK: 3: [B6.1].~A() (Implicit destructor) |
| // CHECK: 4: [B7.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (2): B2 B3 |
| // CHECK: Successors (1): B0 |
| // CHECK: [ B2 ] |
| // CHECK: 1: A b; |
| // CHECK: 2: [B2.1].~A() (Implicit destructor) |
| // CHECK: 3: [B6.2].~A() (Implicit destructor) |
| // CHECK: Predecessors (1): B4 |
| // CHECK: Successors (1): B1 |
| // CHECK: [ B3 ] |
| // CHECK: 1: [B6.2].~A() (Implicit destructor) |
| // CHECK: T: goto l1; |
| // CHECK: Predecessors (1): B4 |
| // CHECK: Successors (1): B1 |
| // CHECK: [ B4 ] |
| // CHECK: 1: UV |
| // CHECK: T: if [B4.1] |
| // CHECK: Predecessors (1): B6 |
| // CHECK: Successors (2): B3 B2 |
| // CHECK: [ B5 ] |
| // CHECK: 1: [B6.2].~A() (Implicit destructor) |
| // CHECK: 2: [B6.1].~A() (Implicit destructor) |
| // CHECK: T: goto l0; |
| // CHECK: Predecessors (1): B6 |
| // CHECK: Successors (1): B6 |
| // CHECK: [ B6 ] |
| // CHECK: l0: |
| // CHECK: 1: A b; |
| // CHECK: 2: A a; |
| // CHECK: 3: UV |
| // CHECK: T: if [B6.3] |
| // CHECK: Predecessors (2): B7 B5 |
| // CHECK: Successors (2): B5 B4 |
| // CHECK: [ B7 ] |
| // CHECK: 1: A a; |
| // CHECK: Predecessors (1): B8 |
| // CHECK: Successors (1): B6 |
| // CHECK: [ B0 (EXIT) ] |
| // CHECK: Predecessors (1): B1 |
| // CHECK: Successors (0): |
| // CHECK: [ B5 (ENTRY) ] |
| // CHECK: Predecessors (0): |
| // CHECK: Successors (1): B4 |
| // CHECK: [ B1 ] |
| // CHECK: 1: [B4.3].~A() (Implicit destructor) |
| // CHECK: 2: [B4.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (2): B2 B3 |
| // CHECK: Successors (1): B0 |
| // CHECK: [ B2 ] |
| // CHECK: 1: A c; |
| // CHECK: 2: [B2.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (1): B4 |
| // CHECK: Successors (1): B1 |
| // CHECK: [ B3 ] |
| // CHECK: 1: A c; |
| // CHECK: 2: [B3.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (1): B4 |
| // CHECK: Successors (1): B1 |
| // CHECK: [ B4 ] |
| // CHECK: 1: A a; |
| // CHECK: 2: a |
| // CHECK: 3: if ([B4.5]) |
| // CHECK: [B3.1]else |
| // CHECK: [B2.1] 4: b.operator int() |
| // CHECK: 5: [B4.4] |
| // CHECK: T: if [B4.5] |
| // CHECK: Predecessors (1): B5 |
| // CHECK: Successors (2): B3 B2 |
| // CHECK: [ B0 (EXIT) ] |
| // CHECK: Predecessors (1): B1 |
| // CHECK: Successors (0): |
| // CHECK: [ B9 (ENTRY) ] |
| // CHECK: Predecessors (0): |
| // CHECK: Successors (1): B8 |
| // CHECK: [ B1 ] |
| // CHECK: 1: [B8.3].~A() (Implicit destructor) |
| // CHECK: 2: A e; |
| // CHECK: 3: [B1.2].~A() (Implicit destructor) |
| // CHECK: 4: [B8.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (2): B2 B5 |
| // CHECK: Successors (1): B0 |
| // CHECK: [ B2 ] |
| // CHECK: 1: A d; |
| // CHECK: 2: [B2.1].~A() (Implicit destructor) |
| // CHECK: 3: [B4.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (1): B4 |
| // CHECK: Successors (1): B1 |
| // CHECK: [ B3 ] |
| // CHECK: 1: return; |
| // CHECK: 2: [B4.1].~A() (Implicit destructor) |
| // CHECK: 3: [B8.3].~A() (Implicit destructor) |
| // CHECK: 4: [B8.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (1): B4 |
| // CHECK: Successors (1): B0 |
| // CHECK: [ B4 ] |
| // CHECK: 1: A c; |
| // CHECK: 2: UV |
| // CHECK: T: if [B4.2] |
| // CHECK: Predecessors (1): B8 |
| // CHECK: Successors (2): B3 B2 |
| // CHECK: [ B5 ] |
| // CHECK: 1: A d; |
| // CHECK: 2: [B5.1].~A() (Implicit destructor) |
| // CHECK: 3: [B7.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (1): B7 |
| // CHECK: Successors (1): B1 |
| // CHECK: [ B6 ] |
| // CHECK: 1: return; |
| // CHECK: 2: [B7.1].~A() (Implicit destructor) |
| // CHECK: 3: [B8.3].~A() (Implicit destructor) |
| // CHECK: 4: [B8.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (1): B7 |
| // CHECK: Successors (1): B0 |
| // CHECK: [ B7 ] |
| // CHECK: 1: A c; |
| // CHECK: 2: UV |
| // CHECK: T: if [B7.2] |
| // CHECK: Predecessors (1): B8 |
| // CHECK: Successors (2): B6 B5 |
| // CHECK: [ B8 ] |
| // CHECK: 1: A a; |
| // CHECK: 2: a |
| // CHECK: 3: if ([B8.5]) { |
| // CHECK: [B7.1] if ([B7.2]) |
| // CHECK: [B6.1][B5.1]} else { |
| // CHECK: [B4.1] if ([B4.2]) |
| // CHECK: [B3.1][B2.1]} |
| // CHECK: 4: b.operator int() |
| // CHECK: 5: [B8.4] |
| // CHECK: T: if [B8.5] |
| // CHECK: Predecessors (1): B9 |
| // CHECK: Successors (2): B7 B4 |
| // CHECK: [ B0 (EXIT) ] |
| // CHECK: Predecessors (3): B1 B3 B6 |
| // CHECK: Successors (0): |
| // CHECK: [ B6 (ENTRY) ] |
| // CHECK: Predecessors (0): |
| // CHECK: Successors (1): B5 |
| // CHECK: [ B1 ] |
| // CHECK: 1: [B2.2].~A() (Implicit destructor) |
| // CHECK: 2: [B5.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (1): B2 |
| // CHECK: Successors (1): B0 |
| // CHECK: [ B2 ] |
| // CHECK: 1: a |
| // CHECK: 2: while ([B2.4]) |
| // CHECK: [B4.1] 3: b.operator int() |
| // CHECK: 4: [B2.3] |
| // CHECK: T: while [B2.4] |
| // CHECK: Predecessors (2): B3 B5 |
| // CHECK: Successors (2): B4 B1 |
| // CHECK: [ B3 ] |
| // CHECK: Predecessors (1): B4 |
| // CHECK: Successors (1): B2 |
| // CHECK: [ B4 ] |
| // CHECK: 1: A c; |
| // CHECK: 2: [B4.1].~A() (Implicit destructor) |
| // CHECK: 3: [B2.2].~A() (Implicit destructor) |
| // CHECK: Predecessors (1): B2 |
| // CHECK: Successors (1): B3 |
| // CHECK: [ B5 ] |
| // CHECK: 1: A a; |
| // CHECK: Predecessors (1): B6 |
| // CHECK: Successors (1): B2 |
| // CHECK: [ B0 (EXIT) ] |
| // CHECK: Predecessors (1): B1 |
| // CHECK: Successors (0): |
| // CHECK: [ B12 (ENTRY) ] |
| // CHECK: Predecessors (0): |
| // CHECK: Successors (1): B11 |
| // CHECK: [ B1 ] |
| // CHECK: 1: [B2.2].~A() (Implicit destructor) |
| // CHECK: 2: A e; |
| // CHECK: 3: [B1.2].~A() (Implicit destructor) |
| // CHECK: 4: [B11.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (2): B9 B2 |
| // CHECK: Successors (1): B0 |
| // CHECK: [ B2 ] |
| // CHECK: 1: a |
| // CHECK: 2: while ([B2.4]) |
| // CHECK: { |
| // CHECK: [B10.1] if ([B10.2]) |
| // CHECK: break; |
| // CHECK: if ([B8.1]) |
| // CHECK: continue; |
| // CHECK: if ([B6.1]) |
| // CHECK: [B5.1][B4.1] } |
| // CHECK: 3: b.operator int() |
| // CHECK: 4: [B2.3] |
| // CHECK: T: while [B2.4] |
| // CHECK: Predecessors (2): B3 B11 |
| // CHECK: Successors (2): B10 B1 |
| // CHECK: [ B3 ] |
| // CHECK: Predecessors (2): B4 B7 |
| // CHECK: Successors (1): B2 |
| // CHECK: [ B4 ] |
| // CHECK: 1: A d; |
| // CHECK: 2: [B4.1].~A() (Implicit destructor) |
| // CHECK: 3: [B10.1].~A() (Implicit destructor) |
| // CHECK: 4: [B2.2].~A() (Implicit destructor) |
| // CHECK: Predecessors (1): B6 |
| // CHECK: Successors (1): B3 |
| // CHECK: [ B5 ] |
| // CHECK: 1: return; |
| // CHECK: 2: [B10.1].~A() (Implicit destructor) |
| // CHECK: 3: [B2.2].~A() (Implicit destructor) |
| // CHECK: 4: [B11.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (1): B6 |
| // CHECK: Successors (1): B0 |
| // CHECK: [ B6 ] |
| // CHECK: 1: UV |
| // CHECK: T: if [B6.1] |
| // CHECK: Predecessors (1): B8 |
| // CHECK: Successors (2): B5 B4 |
| // CHECK: [ B7 ] |
| // CHECK: 1: [B10.1].~A() (Implicit destructor) |
| // CHECK: 2: [B2.2].~A() (Implicit destructor) |
| // CHECK: T: continue; |
| // CHECK: Predecessors (1): B8 |
| // CHECK: Successors (1): B3 |
| // CHECK: [ B8 ] |
| // CHECK: 1: UV |
| // CHECK: T: if [B8.1] |
| // CHECK: Predecessors (1): B10 |
| // CHECK: Successors (2): B7 B6 |
| // CHECK: [ B9 ] |
| // CHECK: 1: [B10.1].~A() (Implicit destructor) |
| // CHECK: T: break; |
| // CHECK: Predecessors (1): B10 |
| // CHECK: Successors (1): B1 |
| // CHECK: [ B10 ] |
| // CHECK: 1: A c; |
| // CHECK: 2: UV |
| // CHECK: T: if [B10.2] |
| // CHECK: Predecessors (1): B2 |
| // CHECK: Successors (2): B9 B8 |
| // CHECK: [ B11 ] |
| // CHECK: 1: A a; |
| // CHECK: Predecessors (1): B12 |
| // CHECK: Successors (1): B2 |
| // CHECK: [ B0 (EXIT) ] |
| // CHECK: Predecessors (2): B1 B5 |
| // CHECK: Successors (0): |
| // CHECK: [ B4 (ENTRY) ] |
| // CHECK: Predecessors (0): |
| // CHECK: Successors (1): B2 |
| // CHECK: [ B1 ] |
| // CHECK: 1: UV |
| // CHECK: T: do ... while [B1.1] |
| // CHECK: Predecessors (1): B2 |
| // CHECK: Successors (2): B3 B0 |
| // CHECK: [ B2 ] |
| // CHECK: 1: A a; |
| // CHECK: 2: [B2.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (2): B3 B4 |
| // CHECK: Successors (1): B1 |
| // CHECK: [ B3 ] |
| // CHECK: Predecessors (1): B1 |
| // CHECK: Successors (1): B2 |
| // CHECK: [ B0 (EXIT) ] |
| // CHECK: Predecessors (1): B1 |
| // CHECK: Successors (0): |
| // CHECK: [ B12 (ENTRY) ] |
| // CHECK: Predecessors (0): |
| // CHECK: Successors (1): B11 |
| // CHECK: [ B1 ] |
| // CHECK: 1: A d; |
| // CHECK: 2: [B1.1].~A() (Implicit destructor) |
| // CHECK: 3: [B11.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (2): B8 B2 |
| // CHECK: Successors (1): B0 |
| // CHECK: [ B2 ] |
| // CHECK: 1: UV |
| // CHECK: T: do ... while [B2.1] |
| // CHECK: Predecessors (2): B3 B6 |
| // CHECK: Successors (2): B10 B1 |
| // CHECK: [ B3 ] |
| // CHECK: 1: A c; |
| // CHECK: 2: [B3.1].~A() (Implicit destructor) |
| // CHECK: 3: [B9.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (1): B5 |
| // CHECK: Successors (1): B2 |
| // CHECK: [ B4 ] |
| // CHECK: 1: return; |
| // CHECK: 2: [B9.1].~A() (Implicit destructor) |
| // CHECK: 3: [B11.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (1): B5 |
| // CHECK: Successors (1): B0 |
| // CHECK: [ B5 ] |
| // CHECK: 1: UV |
| // CHECK: T: if [B5.1] |
| // CHECK: Predecessors (1): B7 |
| // CHECK: Successors (2): B4 B3 |
| // CHECK: [ B6 ] |
| // CHECK: 1: [B9.1].~A() (Implicit destructor) |
| // CHECK: T: continue; |
| // CHECK: Predecessors (1): B7 |
| // CHECK: Successors (1): B2 |
| // CHECK: [ B7 ] |
| // CHECK: 1: UV |
| // CHECK: T: if [B7.1] |
| // CHECK: Predecessors (1): B9 |
| // CHECK: Successors (2): B6 B5 |
| // CHECK: [ B8 ] |
| // CHECK: 1: [B9.1].~A() (Implicit destructor) |
| // CHECK: T: break; |
| // CHECK: Predecessors (1): B9 |
| // CHECK: Successors (1): B1 |
| // CHECK: [ B9 ] |
| // CHECK: 1: A b; |
| // CHECK: 2: UV |
| // CHECK: T: if [B9.2] |
| // CHECK: Predecessors (2): B10 B11 |
| // CHECK: Successors (2): B8 B7 |
| // CHECK: [ B10 ] |
| // CHECK: Predecessors (1): B2 |
| // CHECK: Successors (1): B9 |
| // CHECK: [ B11 ] |
| // CHECK: 1: A a; |
| // CHECK: Predecessors (1): B12 |
| // CHECK: Successors (1): B9 |
| // CHECK: [ B0 (EXIT) ] |
| // CHECK: Predecessors (2): B1 B4 |
| // CHECK: Successors (0): |
| // CHECK: [ B4 (ENTRY) ] |
| // CHECK: Predecessors (0): |
| // CHECK: Successors (1): B2 |
| // CHECK: [ B1 ] |
| // CHECK: 1: [B2.3].~A() (Implicit destructor) |
| // CHECK: 2: [B2.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (2): B3 B2 |
| // CHECK: Successors (1): B0 |
| // CHECK: [ B2 ] |
| // CHECK: 1: A a; |
| // CHECK: 2: a |
| // CHECK: 3: switch ([B2.4]) |
| // CHECK: [B3.1] 4: b.operator int() |
| // CHECK: T: switch [B2.4] |
| // CHECK: Predecessors (1): B4 |
| // CHECK: Successors (1): B1 |
| // CHECK: [ B3 ] |
| // CHECK: 1: A c; |
| // CHECK: 2: [B3.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (0): |
| // CHECK: Successors (1): B1 |
| // CHECK: [ B0 (EXIT) ] |
| // CHECK: Predecessors (1): B1 |
| // CHECK: Successors (0): |
| // CHECK: [ B9 (ENTRY) ] |
| // CHECK: Predecessors (0): |
| // CHECK: Successors (1): B2 |
| // CHECK: [ B1 ] |
| // CHECK: 1: [B2.3].~A() (Implicit destructor) |
| // CHECK: 2: A g; |
| // CHECK: 3: [B1.2].~A() (Implicit destructor) |
| // CHECK: 4: [B2.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (3): B3 B7 B2 |
| // CHECK: Successors (1): B0 |
| // CHECK: [ B2 ] |
| // CHECK: 1: A a; |
| // CHECK: 2: a |
| // CHECK: 3: switch ([B2.4]) { |
| // CHECK: case 0: |
| // CHECK: { |
| // CHECK: [B8.1] if ([B8.2]) |
| // CHECK: break; |
| // CHECK: if ([B6.1]) |
| // CHECK: [B5.1][B4.1] } |
| // CHECK: case 1: |
| // CHECK: break; |
| // CHECK: } |
| // CHECK: 4: b.operator int() |
| // CHECK: T: switch [B2.4] |
| // CHECK: Predecessors (1): B9 |
| // CHECK: Successors (3): B3 B8 |
| // CHECK: B1 |
| // CHECK: [ B3 ] |
| // CHECK: case 1: |
| // CHECK: T: break; |
| // CHECK: Predecessors (2): B2 B4 |
| // CHECK: Successors (1): B1 |
| // CHECK: [ B4 ] |
| // CHECK: 1: A f; |
| // CHECK: 2: [B4.1].~A() (Implicit destructor) |
| // CHECK: 3: [B8.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (1): B6 |
| // CHECK: Successors (1): B3 |
| // CHECK: [ B5 ] |
| // CHECK: 1: return; |
| // CHECK: 2: [B8.1].~A() (Implicit destructor) |
| // CHECK: 3: [B2.3].~A() (Implicit destructor) |
| // CHECK: 4: [B2.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (1): B6 |
| // CHECK: Successors (1): B0 |
| // CHECK: [ B6 ] |
| // CHECK: 1: UV |
| // CHECK: T: if [B6.1] |
| // CHECK: Predecessors (1): B8 |
| // CHECK: Successors (2): B5 B4 |
| // CHECK: [ B7 ] |
| // CHECK: 1: [B8.1].~A() (Implicit destructor) |
| // CHECK: T: break; |
| // CHECK: Predecessors (1): B8 |
| // CHECK: Successors (1): B1 |
| // CHECK: [ B8 ] |
| // CHECK: case 0: |
| // CHECK: 1: A c; |
| // CHECK: 2: UV |
| // CHECK: T: if [B8.2] |
| // CHECK: Predecessors (1): B2 |
| // CHECK: Successors (2): B7 B6 |
| // CHECK: [ B0 (EXIT) ] |
| // CHECK: Predecessors (2): B1 B5 |
| // CHECK: Successors (0): |
| // CHECK: [ B6 (ENTRY) ] |
| // CHECK: Predecessors (0): |
| // CHECK: Successors (1): B5 |
| // CHECK: [ B1 ] |
| // CHECK: 1: [B2.2].~A() (Implicit destructor) |
| // CHECK: 2: [B5.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (1): B2 |
| // CHECK: Successors (1): B0 |
| // CHECK: [ B2 ] |
| // CHECK: 1: a |
| // CHECK: 2: for (A a; [B2.4];) |
| // CHECK: [B4.1] 3: b.operator int() |
| // CHECK: 4: [B2.3] |
| // CHECK: T: for (...; [B2.4]; ) |
| // CHECK: Predecessors (2): B3 B5 |
| // CHECK: Successors (2): B4 B1 |
| // CHECK: [ B3 ] |
| // CHECK: 1: [B2.2].~A() (Implicit destructor) |
| // CHECK: Predecessors (1): B4 |
| // CHECK: Successors (1): B2 |
| // CHECK: [ B4 ] |
| // CHECK: 1: A c; |
| // CHECK: 2: [B4.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (1): B2 |
| // CHECK: Successors (1): B3 |
| // CHECK: [ B5 ] |
| // CHECK: 1: A a; |
| // CHECK: Predecessors (1): B6 |
| // CHECK: Successors (1): B2 |
| // CHECK: [ B0 (EXIT) ] |
| // CHECK: Predecessors (1): B1 |
| // CHECK: Successors (0): |
| // CHECK: [ B12 (ENTRY) ] |
| // CHECK: Predecessors (0): |
| // CHECK: Successors (1): B11 |
| // CHECK: [ B1 ] |
| // CHECK: 1: [B2.2].~A() (Implicit destructor) |
| // CHECK: 2: [B11.2].~A() (Implicit destructor) |
| // CHECK: 3: A f; |
| // CHECK: 4: [B1.3].~A() (Implicit destructor) |
| // CHECK: 5: [B11.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (2): B9 B2 |
| // CHECK: Successors (1): B0 |
| // CHECK: [ B2 ] |
| // CHECK: 1: b |
| // CHECK: 2: for (A b; [B2.4];) { |
| // CHECK: [B10.1] if ([B10.2]) |
| // CHECK: break; |
| // CHECK: if ([B8.1]) |
| // CHECK: continue; |
| // CHECK: if ([B6.1]) |
| // CHECK: [B5.1][B4.1]} |
| // CHECK: 3: c.operator int() |
| // CHECK: 4: [B2.3] |
| // CHECK: T: for (...; [B2.4]; ) |
| // CHECK: Predecessors (2): B3 B11 |
| // CHECK: Successors (2): B10 B1 |
| // CHECK: [ B3 ] |
| // CHECK: 1: [B2.2].~A() (Implicit destructor) |
| // CHECK: Predecessors (2): B4 B7 |
| // CHECK: Successors (1): B2 |
| // CHECK: [ B4 ] |
| // CHECK: 1: A e; |
| // CHECK: 2: [B4.1].~A() (Implicit destructor) |
| // CHECK: 3: [B10.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (1): B6 |
| // CHECK: Successors (1): B3 |
| // CHECK: [ B5 ] |
| // CHECK: 1: return; |
| // CHECK: 2: [B10.1].~A() (Implicit destructor) |
| // CHECK: 3: [B2.2].~A() (Implicit destructor) |
| // CHECK: 4: [B11.2].~A() (Implicit destructor) |
| // CHECK: 5: [B11.1].~A() (Implicit destructor) |
| // CHECK: Predecessors (1): B6 |
| // CHECK: Successors (1): B0 |
| // CHECK: [ B6 ] |
| // CHECK: 1: UV |
| // CHECK: T: if [B6.1] |
| // CHECK: Predecessors (1): B8 |
| // CHECK: Successors (2): B5 B4 |
| // CHECK: [ B7 ] |
| // CHECK: 1: [B10.1].~A() (Implicit destructor) |
| // CHECK: T: continue; |
| // CHECK: Predecessors (1): B8 |
| // CHECK: Successors (1): B3 |
| // CHECK: [ B8 ] |
| // CHECK: 1: UV |
| // CHECK: T: if [B8.1] |
| // CHECK: Predecessors (1): B10 |
| // CHECK: Successors (2): B7 B6 |
| // CHECK: [ B9 ] |
| // CHECK: 1: [B10.1].~A() (Implicit destructor) |
| // CHECK: T: break; |
| // CHECK: Predecessors (1): B10 |
| // CHECK: Successors (1): B1 |
| // CHECK: [ B10 ] |
| // CHECK: 1: A d; |
| // CHECK: 2: UV |
| // CHECK: T: if [B10.2] |
| // CHECK: Predecessors (1): B2 |
| // CHECK: Successors (2): B9 B8 |
| // CHECK: [ B11 ] |
| // CHECK: 1: A a; |
| // CHECK: 2: A b; |
| // CHECK: Predecessors (1): B12 |
| // CHECK: Successors (1): B2 |
| // CHECK: [ B0 (EXIT) ] |
| // CHECK: Predecessors (2): B1 B5 |
| // CHECK: Successors (0): |
| // CHECK: [ B3 (ENTRY) ] |
| // CHECK: Predecessors (0): |
| // CHECK: Successors (1): B0 |
| // CHECK: [ B1 ] |
| // CHECK: T: try ... |
| // CHECK: Predecessors (0): |
| // CHECK: Successors (2): B2 B0 |
| // CHECK: [ B2 ] |
| // CHECK: catch (const A &e): |
| // CHECK: Predecessors (1): B1 |
| // CHECK: Successors (1): B0 |
| // CHECK: [ B0 (EXIT) ] |
| // CHECK: Predecessors (3): B2 B1 B3 |
| // CHECK: Successors (0): |
| // CHECK: [ B3 (ENTRY) ] |
| // CHECK: Predecessors (0): |
| // CHECK: Successors (1): B0 |
| // CHECK: [ B1 ] |
| // CHECK: T: try ... |
| // CHECK: Predecessors (0): |
| // CHECK: Successors (2): B2 B0 |
| // CHECK: [ B2 ] |
| // CHECK: catch (A e): |
| // CHECK: 1: .~A() (Implicit destructor) |
| // CHECK: Predecessors (1): B1 |
| // CHECK: Successors (1): B0 |
| // CHECK: [ B0 (EXIT) ] |
| // CHECK: Predecessors (3): B2 B1 B3 |
| // CHECK: Successors (0): |