// 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)