| // RUN: %clang_analyze_cc1 -std=c++14 %s \ | |
| // RUN: -analyzer-checker=debug.DumpDominators \ | |
| // RUN: -analyzer-checker=debug.DumpPostDominators \ | |
| // RUN: -analyzer-checker=debug.DumpControlDependencies \ | |
| // RUN: 2>&1 | FileCheck %s | |
| bool coin(); | |
| namespace pr42041_unreachable_cfg_successor { | |
| enum Kind { | |
| A | |
| }; | |
| void f() { | |
| switch(Kind{}) { | |
| case A: | |
| break; | |
| } | |
| } | |
| } // end of namespace pr42041_unreachable_cfg_successor | |
| // [B3 (ENTRY)] -> [B1] -> [B2] -> [B0 (EXIT)] | |
| // CHECK: Control dependencies (Node#,Dependency#): | |
| // CHECK-NEXT: Immediate dominance tree (Node#,IDom#): | |
| // CHECK-NEXT: (0,2) | |
| // CHECK-NEXT: (1,3) | |
| // CHECK-NEXT: (2,1) | |
| // CHECK-NEXT: (3,3) | |
| // CHECK-NEXT: Immediate post dominance tree (Node#,IDom#): | |
| // CHECK-NEXT: (0,0) | |
| // CHECK-NEXT: (1,2) | |
| // CHECK-NEXT: (2,0) | |
| // CHECK-NEXT: (3,1) | |
| void funcWithBranch() { | |
| int x = 0; | |
| if (coin()) { | |
| if (coin()) { | |
| x = 5; | |
| } | |
| int j = 10 / x; | |
| (void)j; | |
| } | |
| } | |
| // 1st if 2nd if | |
| // [B5 (ENTRY)] -> [B4] -> [B3] -> [B2] -> [B1] -> [B0 (EXIT)] | |
| // \ \ / / | |
| // \ -------------> / | |
| // ------------------------------> | |
| // CHECK: Control dependencies (Node#,Dependency#): | |
| // CHECK-NEXT: (1,4) | |
| // CHECK-NEXT: (2,3) | |
| // CHECK-NEXT: (2,4) | |
| // CHECK-NEXT: (3,4) | |
| // CHECK-NEXT: Immediate dominance tree (Node#,IDom#): | |
| // CHECK-NEXT: (0,4) | |
| // CHECK-NEXT: (1,3) | |
| // CHECK-NEXT: (2,3) | |
| // CHECK-NEXT: (3,4) | |
| // CHECK-NEXT: (4,5) | |
| // CHECK-NEXT: (5,5) | |
| // CHECK-NEXT: Immediate post dominance tree (Node#,IDom#): | |
| // CHECK-NEXT: (0,0) | |
| // CHECK-NEXT: (1,0) | |
| // CHECK-NEXT: (2,1) | |
| // CHECK-NEXT: (3,1) | |
| // CHECK-NEXT: (4,0) | |
| // CHECK-NEXT: (5,4) |