Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.0.0-20201028153306-37f0764111ff / cmd / guru / testdata / src / pointsto / main.go
1 package main
2
3 // Tests of 'pointsto' query.
4 // See go.tools/guru/guru_test.go for explanation.
5 // See pointsto.golden for expected query results.
6
7 const pi = 3.141 // @pointsto const "pi"
8
9 var global = new(string) // NB: ssa.Global is indirect, i.e. **string
10
11 func main() {
12         livecode()
13
14         // func objects
15         _ = main   // @pointsto func-ref-main "main"
16         _ = (*C).f // @pointsto func-ref-*C.f "..C..f"
17         _ = D.f    // @pointsto func-ref-D.f "D.f"
18         _ = I.f    // @pointsto func-ref-I.f "I.f"
19         var d D
20         var i I
21         _ = d.f // @pointsto func-ref-d.f "d.f"
22         _ = i.f // @pointsto func-ref-i.f "i.f"
23
24         // var objects
25         anon := func() {
26                 _ = d.f // @pointsto ref-lexical-d.f "d.f"
27         }
28         _ = anon   // @pointsto ref-anon "anon"
29         _ = global // @pointsto ref-global "global"
30
31         // SSA affords some local flow sensitivity.
32         var a, b int
33         var x = &a // @pointsto var-def-x-1 "x"
34         _ = x      // @pointsto var-ref-x-1 "x"
35         x = &b     // @pointsto var-def-x-2 "x"
36         _ = x      // @pointsto var-ref-x-2 "x"
37
38         i = new(C) // @pointsto var-ref-i-C "i"
39         if i != nil {
40                 i = D{} // @pointsto var-ref-i-D "i"
41         }
42         print(i) // @pointsto var-ref-i "\\bi\\b"
43
44         m := map[string]*int{"a": &a}
45         mapval, _ := m["a"] // @pointsto map-lookup,ok "m..a.."
46         _ = mapval          // @pointsto mapval "mapval"
47         _ = m               // @pointsto m "m"
48
49         if false {
50                 panic(3) // @pointsto builtin-panic "panic"
51         }
52
53         // NB: s.f is addressable per (*ssa.Program).VarValue,
54         // but our query concerns the object, not its address.
55         s := struct{ f interface{} }{f: make(chan bool)}
56         print(s.f) // @pointsto var-ref-s-f "s.f"
57 }
58
59 func livecode() {} // @pointsto func-live "livecode"
60
61 func deadcode() { // @pointsto func-dead "deadcode"
62         // Pointer analysis can't run on dead code.
63         var b = new(int) // @pointsto b "b"
64         _ = b
65 }
66
67 type I interface {
68         f()
69 }
70
71 type C int
72 type D struct{}
73
74 func (c *C) f() {}
75 func (d D) f()  {}