1 | // RUN: %clang_analyze_cc1 -analyzer-checker=debug.DumpCallGraph %s -fblocks 2>&1 | FileCheck %s |
2 | |
3 | int get5() { |
4 | return 5; |
5 | } |
6 | |
7 | int add(int val1, int val2) { |
8 | return val1 + val2; |
9 | } |
10 | |
11 | int test_add() { |
12 | return add(10, get5()); |
13 | } |
14 | |
15 | static void mmm(int y) { |
16 | if (y != 0) |
17 | y++; |
18 | y = y/y; |
19 | } |
20 | |
21 | static int foo(int x, int y) { |
22 | mmm(y); |
23 | if (x != 0) |
24 | x++; |
25 | return 5/x; |
26 | } |
27 | |
28 | void aaa() { |
29 | foo(1,2); |
30 | } |
31 | |
32 | void bbb(int y) { |
33 | int x = (y > 2); |
34 | ^ { |
35 | foo(x, y); |
36 | }(); |
37 | } |
38 | void ccc(); |
39 | void ddd() { ccc(); } |
40 | void ccc() {} |
41 | |
42 | void eee(); |
43 | void eee() {} |
44 | void fff() { eee(); } |
45 | |
46 | // This test case tests that forward declaration for the top-level function |
47 | // does not affect call graph construction. |
48 | void do_nothing() {} |
49 | void test_single_call(); |
50 | void test_single_call() { |
51 | do_nothing(); |
52 | } |
53 | |
54 | namespace SomeNS { |
55 | template<typename T> |
56 | void templ(T t) { |
57 | ccc(); |
58 | } |
59 | |
60 | template<> |
61 | void templ<double>(double t) { |
62 | eee(); |
63 | } |
64 | |
65 | void templUser() { |
66 | templ(5); |
67 | templ(5.5); |
68 | } |
69 | } |
70 | |
71 | // CHECK:--- Call graph Dump --- |
72 | // CHECK-NEXT: {{Function: < root > calls: get5 add test_add mmm foo aaa < > bbb ddd ccc eee fff do_nothing test_single_call SomeNS::templ SomeNS::templ SomeNS::templUser $}} |
73 | // CHECK-NEXT: {{Function: SomeNS::templUser calls: SomeNS::templ SomeNS::templ $}} |
74 | // CHECK-NEXT: {{Function: SomeNS::templ calls: eee $}} |
75 | // CHECK-NEXT: {{Function: SomeNS::templ calls: ccc $}} |
76 | // CHECK-NEXT: {{Function: test_single_call calls: do_nothing $}} |
77 | // CHECK-NEXT: {{Function: do_nothing calls: $}} |
78 | // CHECK-NEXT: {{Function: fff calls: eee $}} |
79 | // CHECK-NEXT: {{Function: eee calls: $}} |
80 | // CHECK-NEXT: {{Function: ddd calls: ccc $}} |
81 | // CHECK-NEXT: {{Function: ccc calls: $}} |
82 | // CHECK-NEXT: {{Function: bbb calls: < > $}} |
83 | // CHECK-NEXT: {{Function: < > calls: foo $}} |
84 | // CHECK-NEXT: {{Function: aaa calls: foo $}} |
85 | // CHECK-NEXT: {{Function: foo calls: mmm $}} |
86 | // CHECK-NEXT: {{Function: mmm calls: $}} |
87 | // CHECK-NEXT: {{Function: test_add calls: add get5 $}} |
88 | // CHECK-NEXT: {{Function: add calls: $}} |
89 | // CHECK-NEXT: {{Function: get5 calls: $}} |
90 | |