1*b0914e72SArtem Dergachev // RUN: %clang_analyze_cc1 -std=c++14 %s \
285211c08SKristof Umann // RUN: -analyzer-checker=debug.DumpDominators \
371a9dc39SKristof Umann // RUN: -analyzer-checker=debug.DumpPostDominators \
45e17ee1eSKristof Umann // RUN: -analyzer-checker=debug.DumpControlDependencies \
585211c08SKristof Umann // RUN: 2>&1 | FileCheck %s
685211c08SKristof Umann
785211c08SKristof Umann bool coin();
885211c08SKristof Umann
985211c08SKristof Umann namespace pr42041_unreachable_cfg_successor {
1085211c08SKristof Umann enum Kind {
1185211c08SKristof Umann A
1285211c08SKristof Umann };
1385211c08SKristof Umann
f()1485211c08SKristof Umann void f() {
1585211c08SKristof Umann switch(Kind{}) {
1685211c08SKristof Umann case A:
1785211c08SKristof Umann break;
1885211c08SKristof Umann }
1985211c08SKristof Umann }
2085211c08SKristof Umann } // end of namespace pr42041_unreachable_cfg_successor
2185211c08SKristof Umann
2285211c08SKristof Umann // [B3 (ENTRY)] -> [B1] -> [B2] -> [B0 (EXIT)]
2385211c08SKristof Umann
245e17ee1eSKristof Umann // CHECK: Control dependencies (Node#,Dependency#):
255e17ee1eSKristof Umann // CHECK-NEXT: Immediate dominance tree (Node#,IDom#):
2685211c08SKristof Umann // CHECK-NEXT: (0,2)
2785211c08SKristof Umann // CHECK-NEXT: (1,3)
2885211c08SKristof Umann // CHECK-NEXT: (2,1)
2985211c08SKristof Umann // CHECK-NEXT: (3,3)
3071a9dc39SKristof Umann // CHECK-NEXT: Immediate post dominance tree (Node#,IDom#):
3171a9dc39SKristof Umann // CHECK-NEXT: (0,0)
3271a9dc39SKristof Umann // CHECK-NEXT: (1,2)
3371a9dc39SKristof Umann // CHECK-NEXT: (2,0)
3471a9dc39SKristof Umann // CHECK-NEXT: (3,1)
3585211c08SKristof Umann
funcWithBranch()3685211c08SKristof Umann void funcWithBranch() {
3785211c08SKristof Umann int x = 0;
3885211c08SKristof Umann if (coin()) {
3985211c08SKristof Umann if (coin()) {
4085211c08SKristof Umann x = 5;
4185211c08SKristof Umann }
4285211c08SKristof Umann int j = 10 / x;
4385211c08SKristof Umann (void)j;
4485211c08SKristof Umann }
4585211c08SKristof Umann }
4685211c08SKristof Umann
475e17ee1eSKristof Umann // 1st if 2nd if
485e17ee1eSKristof Umann // [B5 (ENTRY)] -> [B4] -> [B3] -> [B2] -> [B1] -> [B0 (EXIT)]
495e17ee1eSKristof Umann // \ \ / /
505e17ee1eSKristof Umann // \ -------------> /
515e17ee1eSKristof Umann // ------------------------------>
5285211c08SKristof Umann
535e17ee1eSKristof Umann // CHECK: Control dependencies (Node#,Dependency#):
545e17ee1eSKristof Umann // CHECK-NEXT: (1,4)
555e17ee1eSKristof Umann // CHECK-NEXT: (2,3)
565e17ee1eSKristof Umann // CHECK-NEXT: (2,4)
575e17ee1eSKristof Umann // CHECK-NEXT: (3,4)
585e17ee1eSKristof Umann // CHECK-NEXT: Immediate dominance tree (Node#,IDom#):
5985211c08SKristof Umann // CHECK-NEXT: (0,4)
6085211c08SKristof Umann // CHECK-NEXT: (1,3)
6185211c08SKristof Umann // CHECK-NEXT: (2,3)
6285211c08SKristof Umann // CHECK-NEXT: (3,4)
6385211c08SKristof Umann // CHECK-NEXT: (4,5)
6485211c08SKristof Umann // CHECK-NEXT: (5,5)
6571a9dc39SKristof Umann // CHECK-NEXT: Immediate post dominance tree (Node#,IDom#):
6671a9dc39SKristof Umann // CHECK-NEXT: (0,0)
6771a9dc39SKristof Umann // CHECK-NEXT: (1,0)
6871a9dc39SKristof Umann // CHECK-NEXT: (2,1)
6971a9dc39SKristof Umann // CHECK-NEXT: (3,1)
7071a9dc39SKristof Umann // CHECK-NEXT: (4,0)
7171a9dc39SKristof Umann // CHECK-NEXT: (5,4)
72