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 / go / ssa / testdata / valueforexpr.go
1 // +build ignore
2
3 package main
4
5 // This file is the input to TestValueForExpr in source_test.go, which
6 // ensures that each expression e immediately following a /*@kind*/(x)
7 // annotation, when passed to Function.ValueForExpr(e), returns a
8 // non-nil Value of the same type as e and of kind 'kind'.
9
10 func f(spilled, unspilled int) {
11         _ = /*@UnOp*/ (spilled)
12         _ = /*@Parameter*/ (unspilled)
13         _ = /*@nil*/ (1 + 2) // (constant)
14         i := 0
15
16         f := func() (int, int) { return 0, 0 }
17
18         /*@Call*/
19         (print( /*@BinOp*/ (i + 1)))
20         _, _ = /*@Call*/ (f())
21         ch := /*@MakeChan*/ (make(chan int))
22         /*@UnOp*/ (<-ch)
23         x := /*@UnOp*/ (<-ch)
24         _ = x
25         select {
26         case /*@Extract*/ (<-ch):
27         case x := /*@Extract*/ (<-ch):
28                 _ = x
29         }
30         defer /*@Function*/ (func() {
31         })()
32         go /*@Function*/ (func() {
33         })()
34         y := 0
35         if true && /*@BinOp*/ (bool(y > 0)) {
36                 y = 1
37         }
38         _ = /*@Phi*/ (y)
39         map1 := /*@MakeMap*/ (make(map[string]string))
40         _ = map1
41         _ = /*@Slice*/ (make([]int, 0))
42         _ = /*@MakeClosure*/ (func() { print(spilled) })
43
44         sl := []int{}
45         _ = /*@Slice*/ (sl[:0])
46
47         _ = /*@nil*/ (new(int)) // optimized away
48         tmp := /*@Alloc*/ (new(int))
49         _ = tmp
50         var iface interface{}
51         _ = /*@TypeAssert*/ (iface.(int))
52         _ = /*@UnOp*/ (sl[0])
53         _ = /*@IndexAddr*/ (&sl[0])
54         _ = /*@Index*/ ([2]int{}[0])
55         var p *int
56         _ = /*@UnOp*/ (*p)
57
58         _ = /*@UnOp*/ (global)
59         /*@UnOp*/ (global)[""] = ""
60         /*@Global*/ (global) = map[string]string{}
61
62         var local t
63         /*UnOp*/ (local.x) = 1
64
65         // Exercise corner-cases of lvalues vs rvalues.
66         type N *N
67         var n N
68         /*@UnOp*/ (n) = /*@UnOp*/ (n)
69         /*@ChangeType*/ (n) = /*@Alloc*/ (&n)
70         /*@UnOp*/ (n) = /*@UnOp*/ (*n)
71         /*@UnOp*/ (n) = /*@UnOp*/ (**n)
72 }
73
74 func complit() {
75         // Composite literals.
76         // We get different results for
77         // - composite literal as value (e.g. operand to print)
78         // - composite literal initializer for addressable value
79         // - composite literal value assigned to blank var
80
81         // 1. Slices
82         print( /*@Slice*/ ([]int{}))
83         print( /*@Alloc*/ (&[]int{}))
84         print(& /*@Slice*/ ([]int{}))
85
86         sl1 := /*@Slice*/ ([]int{})
87         sl2 := /*@Alloc*/ (&[]int{})
88         sl3 := & /*@Slice*/ ([]int{})
89         _, _, _ = sl1, sl2, sl3
90
91         _ = /*@Slice*/ ([]int{})
92         _ = /*@nil*/ (& /*@Slice*/ ([]int{})) // & optimized away
93         _ = & /*@Slice*/ ([]int{})
94
95         // 2. Arrays
96         print( /*@UnOp*/ ([1]int{}))
97         print( /*@Alloc*/ (&[1]int{}))
98         print(& /*@Alloc*/ ([1]int{}))
99
100         arr1 := /*@Alloc*/ ([1]int{})
101         arr2 := /*@Alloc*/ (&[1]int{})
102         arr3 := & /*@Alloc*/ ([1]int{})
103         _, _, _ = arr1, arr2, arr3
104
105         _ = /*@UnOp*/ ([1]int{})
106         _ = /*@Alloc*/ (& /*@Alloc*/ ([1]int{}))
107         _ = & /*@Alloc*/ ([1]int{})
108
109         // 3. Maps
110         type M map[int]int
111         print( /*@MakeMap*/ (M{}))
112         print( /*@Alloc*/ (&M{}))
113         print(& /*@MakeMap*/ (M{}))
114
115         m1 := /*@MakeMap*/ (M{})
116         m2 := /*@Alloc*/ (&M{})
117         m3 := & /*@MakeMap*/ (M{})
118         _, _, _ = m1, m2, m3
119
120         _ = /*@MakeMap*/ (M{})
121         _ = /*@nil*/ (& /*@MakeMap*/ (M{})) // & optimized away
122         _ = & /*@MakeMap*/ (M{})
123
124         // 4. Structs
125         print( /*@UnOp*/ (struct{}{}))
126         print( /*@Alloc*/ (&struct{}{}))
127         print(& /*@Alloc*/ (struct{}{}))
128
129         s1 := /*@Alloc*/ (struct{}{})
130         s2 := /*@Alloc*/ (&struct{}{})
131         s3 := & /*@Alloc*/ (struct{}{})
132         _, _, _ = s1, s2, s3
133
134         _ = /*@UnOp*/ (struct{}{})
135         _ = /*@Alloc*/ (& /*@Alloc*/ (struct{}{}))
136         _ = & /*@Alloc*/ (struct{}{})
137 }
138
139 type t struct{ x int }
140
141 // Ensure we can locate methods of named types.
142 func (t) f(param int) {
143         _ = /*@Parameter*/ (param)
144 }
145
146 // Ensure we can locate init functions.
147 func init() {
148         m := /*@MakeMap*/ (make(map[string]string))
149         _ = m
150 }
151
152 // Ensure we can locate variables in initializer expressions.
153 var global = /*@MakeMap*/ (make(map[string]string))