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