1 // RUN: %clang_analyze_cc1 -std=c++14 %s \
2 // RUN:   -analyzer-checker=debug.DumpDominators \
3 // RUN:   -analyzer-checker=debug.DumpPostDominators \
4 // RUN:   -analyzer-checker=debug.DumpControlDependencies \
5 // RUN:   2>&1 | FileCheck %s
6 
7 bool coin();
8 
9 namespace pr42041_unreachable_cfg_successor {
10 enum Kind {
11   A
12 };
13 
f()14 void f() {
15   switch(Kind{}) {
16   case A:
17     break;
18   }
19 }
20 } // end of namespace pr42041_unreachable_cfg_successor
21 
22 //  [B3 (ENTRY)]  -> [B1] -> [B2] -> [B0 (EXIT)]
23 
24 // CHECK:      Control dependencies (Node#,Dependency#):
25 // CHECK-NEXT: Immediate dominance tree (Node#,IDom#):
26 // CHECK-NEXT: (0,2)
27 // CHECK-NEXT: (1,3)
28 // CHECK-NEXT: (2,1)
29 // CHECK-NEXT: (3,3)
30 // CHECK-NEXT: Immediate post dominance tree (Node#,IDom#):
31 // CHECK-NEXT: (0,0)
32 // CHECK-NEXT: (1,2)
33 // CHECK-NEXT: (2,0)
34 // CHECK-NEXT: (3,1)
35 
funcWithBranch()36 void funcWithBranch() {
37   int x = 0;
38   if (coin()) {
39     if (coin()) {
40       x = 5;
41     }
42     int j = 10 / x;
43     (void)j;
44   }
45 }
46 
47 //                  1st if  2nd if
48 //  [B5 (ENTRY)]  -> [B4] -> [B3] -> [B2] -> [B1] -> [B0 (EXIT)]
49 //                    \        \              /         /
50 //                     \        ------------->         /
51 //                      ------------------------------>
52 
53 // CHECK:      Control dependencies (Node#,Dependency#):
54 // CHECK-NEXT: (1,4)
55 // CHECK-NEXT: (2,3)
56 // CHECK-NEXT: (2,4)
57 // CHECK-NEXT: (3,4)
58 // CHECK-NEXT: Immediate dominance tree (Node#,IDom#):
59 // CHECK-NEXT: (0,4)
60 // CHECK-NEXT: (1,3)
61 // CHECK-NEXT: (2,3)
62 // CHECK-NEXT: (3,4)
63 // CHECK-NEXT: (4,5)
64 // CHECK-NEXT: (5,5)
65 // CHECK-NEXT: Immediate post dominance tree (Node#,IDom#):
66 // CHECK-NEXT: (0,0)
67 // CHECK-NEXT: (1,0)
68 // CHECK-NEXT: (2,1)
69 // CHECK-NEXT: (3,1)
70 // CHECK-NEXT: (4,0)
71 // CHECK-NEXT: (5,4)
72