Clang Project

clang_source_code/test/Analysis/debug-CallGraph.cpp
1// RUN: %clang_analyze_cc1 -analyzer-checker=debug.DumpCallGraph %s -fblocks 2>&1 | FileCheck %s
2
3int get5() {
4  return 5;
5}
6
7int add(int val1, int val2) {
8  return val1 + val2;
9}
10
11int test_add() {
12  return add(10, get5());
13}
14
15static void mmm(int y) {
16  if (y != 0)
17      y++;
18  y = y/y;
19}
20
21static int foo(int x, int y) {
22    mmm(y);
23    if (x != 0)
24      x++;
25    return 5/x;
26}
27
28void aaa() {
29  foo(1,2);
30}
31
32void bbb(int y) {
33  int x = (y > 2);
34  ^ {
35      foo(x, y);
36  }();
37}
38void ccc();
39void ddd() { ccc(); }
40void ccc() {}
41
42void eee();
43void eee() {}
44void fff() { eee(); }
45
46// This test case tests that forward declaration for the top-level function
47// does not affect call graph construction.
48void do_nothing() {}
49void test_single_call();
50void test_single_call() {
51  do_nothing();
52}
53
54namespace SomeNS {
55template<typename T>
56void templ(T t) {
57  ccc();
58}
59
60template<>
61void templ<double>(double t) {
62  eee();
63}
64
65void 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