xref: /llvm-project/clang/test/Analysis/domtest.cpp (revision b0914e7276bf97cb57f84fecc3a95e0d3ceeaf3e)
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