github.com/april1989/origin-go-tools@v0.0.32/cmd/guru/testdata/src/calls/main.go (about) 1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 // Tests of call-graph queries. 8 // See go.tools/guru/guru_test.go for explanation. 9 // See calls.golden for expected query results. 10 11 func A(x *int) { // @pointsto pointsto-A-x "x" 12 // @callers callers-A "^" 13 // @callstack callstack-A "^" 14 } 15 16 func B(x *int) { // @pointsto pointsto-B-x "x" 17 // @callers callers-B "^" 18 } 19 20 func foo() { 21 } 22 23 // apply is not (yet) treated context-sensitively. 24 func apply(f func(x *int), x *int) { 25 f(x) // @callees callees-apply "f" 26 // @callers callers-apply "^" 27 } 28 29 // store *is* treated context-sensitively, 30 // so the points-to sets for pc, pd are precise. 31 func store(ptr **int, value *int) { 32 *ptr = value 33 // @callers callers-store "^" 34 } 35 36 func call(f func() *int) { 37 // Result points to anon function. 38 f() // @pointsto pointsto-result-f "f" 39 40 // Target of call is anon function. 41 f() // @callees callees-main.call-f "f" 42 43 // @callers callers-main.call "^" 44 } 45 46 func main() { 47 var a, b int 48 go apply(A, &a) // @callees callees-main-apply1 "app" 49 defer apply(B, &b) 50 51 var c, d int 52 var pc, pd *int // @pointsto pointsto-pc "pc" 53 store(&pc, &c) 54 store(&pd, &d) 55 _ = pd // @pointsto pointsto-pd "pd" 56 57 call(func() *int { 58 // We are called twice from main.call 59 // @callers callers-main.anon "^" 60 return &a 61 }) 62 63 // Errors 64 _ = "no function call here" // @callees callees-err-no-call "no" 65 print("builtin") // @callees callees-err-builtin "builtin" 66 _ = string("type conversion") // @callees callees-err-conversion "str" 67 call(nil) // @callees callees-err-bad-selection "call\\(nil" 68 if false { 69 main() // @callees callees-err-deadcode1 "main" 70 } 71 var nilFunc func() 72 nilFunc() // @callees callees-err-nil-func "nilFunc" 73 var i interface { 74 f() 75 } 76 i.f() // @callees callees-err-nil-interface "i.f" 77 78 i = new(myint) 79 i.f() // @callees callees-not-a-wrapper "f" 80 81 // statically dispatched calls. Handled specially by callees, so test that they work. 82 foo() // @callees callees-static-call "foo" 83 fmt.Println() // @callees callees-qualified-call "Println" 84 m := new(method) 85 m.f() // @callees callees-static-method-call "f" 86 g := new(embeddedIface) 87 g.iface = m 88 g.f() // @callees callees-implicit-selection-method-call "f" 89 } 90 91 type myint int 92 93 func (myint) f() { 94 // @callers callers-not-a-wrapper "^" 95 } 96 97 type method int 98 99 func (method) f() { 100 } 101 102 type embeddedIface struct { 103 iface 104 } 105 106 type iface interface { 107 f() 108 } 109 110 var dynamic = func() {} 111 112 func deadcode() { 113 main() // @callees callees-err-deadcode2 "main" 114 // @callers callers-err-deadcode "^" 115 // @callstack callstack-err-deadcode "^" 116 117 // Within dead code, dynamic calls have no callees. 118 dynamic() // @callees callees-err-deadcode3 "dynamic" 119 } 120 121 // This code belongs to init. 122 var global = 123 // @callers callers-global "global" 123 124 // The package initializer may be called by other packages' inits, or 125 // in this case, the root of the callgraph. The source-level init functions 126 // are in turn called by it. 127 func init() { 128 // @callstack callstack-init "^" 129 }