Source file
test/fixedbugs/issue20859.go
1
2
3
4
5
6
7 package main
8
9 var sink *[16]byte
10
11
12 func use(b []byte, x byte) {
13 b[0] = x
14 }
15
16
17 func single(x byte) [16]byte {
18 var ret [16]byte
19 use(ret[:8], x)
20 use(ret[8:], x+1)
21 return ret
22 }
23
24
25 func addrTaken(x byte) [16]byte {
26 var ret [16]byte
27 p := &ret
28 p[1] = x
29 return ret
30 }
31
32
33 func captured(x byte) [16]byte {
34 var ret [16]byte
35 func() {
36 ret[2] = x
37 }()
38 return ret
39 }
40
41
42 func multi(x byte, c bool) [16]byte {
43 var ret [16]byte
44 ret[4] = x
45 if c {
46 return ret
47 }
48 ret[5] = x + 1
49 return ret
50 }
51
52
53 func escaped(x byte, c bool) [16]byte {
54 var ret [16]byte
55 ret[3] = x
56 sink = &ret
57 if c {
58 return ret
59 }
60 return [16]byte{4: 99}
61 }
62
63
64 func partial(x byte, c bool) [16]byte {
65 var ret [16]byte
66 ret[6] = x
67 if c {
68 return ret
69 }
70 return [16]byte{7: 77}
71 }
72
73
74 func partialNonCandidateLocal(x byte, c bool) [16]byte {
75 var ret [16]byte
76 ret[8] = x
77 if c {
78 return ret
79 }
80 other := [16]byte{9: 88}
81 return other
82 }
83
84 func check(name string, got, want [16]byte) {
85 if got != want {
86 panic(name)
87 }
88 }
89
90 func main() {
91 var want [16]byte
92
93 want[0] = 10
94 want[8] = 11
95 check("single", single(10), want)
96
97 want = [16]byte{}
98 want[1] = 12
99 check("addrTaken", addrTaken(12), want)
100
101 want = [16]byte{}
102 want[2] = 13
103 check("captured", captured(13), want)
104
105 want = [16]byte{}
106 want[4] = 15
107 check("multi true", multi(15, true), want)
108 want[5] = 16
109 check("multi false", multi(15, false), want)
110
111 want = [16]byte{}
112 want[3] = 14
113 check("escaped true", escaped(14, true), want)
114 if *sink != want {
115 panic("escaped pointer")
116 }
117 want = [16]byte{4: 99}
118 check("escaped false", escaped(14, false), want)
119
120 want = [16]byte{}
121 want[6] = 17
122 check("partial true", partial(17, true), want)
123 want = [16]byte{7: 77}
124 check("partial false", partial(17, false), want)
125
126 want = [16]byte{}
127 want[8] = 18
128 check("partialNonCandidateLocal true", partialNonCandidateLocal(18, true), want)
129 want = [16]byte{9: 88}
130 check("partialNonCandidateLocal false", partialNonCandidateLocal(18, false), want)
131 }
132
View as plain text