traversal-algorithm.mm revision 8d0f528afd9fcb9ebb8ccb4b8a529a05375b628e
1// RUN: %clang_cc1 -analyze -analyzer-checker=debug.DumpTraversal -std=c++11 %s | FileCheck -check-prefix=DFS %s
2
3int a();
4int b();
5int c();
6
7int work();
8
9void test(id input) {
10  if (a()) {
11    if (a())
12      b();
13    else
14      c();
15  } else {
16    if (b())
17      a();
18    else
19      c();
20  }
21
22  if (a())
23    work();
24}
25
26// This ordering assumes that true cases happen before the false cases.
27
28// BFS: 10 IfStmt
29// BFS-NEXT: 11 IfStmt
30// BFS-NEXT: 16 IfStmt
31// BFS-NEXT: 22 IfStmt
32// BFS-NEXT: 22 IfStmt
33// BFS-NEXT: 22 IfStmt
34// BFS-NEXT: 22 IfStmt
35// BFS-NEXT: --END PATH--
36// BFS-NEXT: --END PATH--
37// BFS-NEXT: --END PATH--
38// BFS-NEXT: --END PATH--
39// BFS-NEXT: --END PATH--
40// BFS-NEXT: --END PATH--
41// BFS-NEXT: --END PATH--
42// BFS-NEXT: --END PATH--
43
44// And this ordering assumes that false cases happen before the true cases.
45
46// DFS: 10 IfStmt
47// DFS-NEXT: 16 IfStmt
48// DFS-NEXT: 22 IfStmt
49// DFS-NEXT: --END PATH--
50// DFS-NEXT: --END PATH--
51// DFS-NEXT: 22 IfStmt
52// DFS-NEXT: --END PATH--
53// DFS-NEXT: --END PATH--
54// DFS-NEXT: 11 IfStmt
55// DFS-NEXT: 22 IfStmt
56// DFS-NEXT: --END PATH--
57// DFS-NEXT: --END PATH--
58// DFS-NEXT: 22 IfStmt
59// DFS-NEXT: --END PATH--
60// DFS-NEXT: --END PATH--
61
62
63void testLoops(id input) {
64  while (a()) {
65    work();
66    work();
67    work();
68  }
69
70  for (int i = 0; i != b(); ++i) {
71    work();
72  }
73
74  for (id x in input) {
75    work();
76    work();
77    work();
78  }
79
80  int z[] = {1,2,3};
81  for (int y : z) {
82    work();
83    work();
84    work();
85  }
86}
87
88// BFS: 64 WhileStmt
89// BFS: 70 ForStmt
90// BFS-NOT-NEXT: ObjCForCollectionStmt
91// BFS: 74 ObjCForCollectionStmt
92// BFS: 81 CXXForRangeStmt
93
94// DFS: 64 While
95// DFS-NEXT: 70 ForStmt
96// DFS-NEXT: 74 ObjCForCollectionStmt
97// DFS-NEXT: 81 CXXForRangeStmt
98