blob: 197b481e66de03f015fe82b949a77bbf20c6756e [file] [log] [blame]
Rémy Oudompheng3a4e1562012-10-05 23:30:49 +02001// compile
2
3// Copyright 2012 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7// Various tests for expressions with high complexity.
8
9package main
10
11// Concatenate 16 4-bit integers into a 64-bit number.
12func concat(s *[16]byte) uint64 {
13 r := (((((((((((((((uint64(s[0])<<4|
14 uint64(s[1]))<<4|
15 uint64(s[2]))<<4|
16 uint64(s[3]))<<4|
17 uint64(s[4]))<<4|
18 uint64(s[5]))<<4|
19 uint64(s[6]))<<4|
20 uint64(s[7]))<<4|
21 uint64(s[8]))<<4|
22 uint64(s[9]))<<4|
23 uint64(s[10]))<<4|
24 uint64(s[11]))<<4|
25 uint64(s[12]))<<4|
26 uint64(s[13]))<<4|
27 uint64(s[14]))<<4 |
28 uint64(s[15]))
29 return r
30}
31
32// Compute the determinant of a 4x4-matrix by the sum
33// over all index permutations.
34func determinant(m [4][4]float64) float64 {
35 return m[0][0]*m[1][1]*m[2][2]*m[3][3] -
36 m[0][0]*m[1][1]*m[2][3]*m[3][2] -
37 m[0][0]*m[1][2]*m[2][1]*m[3][3] +
38 m[0][0]*m[1][2]*m[2][3]*m[3][1] +
39 m[0][0]*m[1][3]*m[2][1]*m[3][2] -
40 m[0][0]*m[1][3]*m[2][2]*m[3][1] -
41 m[0][1]*m[1][0]*m[2][2]*m[3][3] +
42 m[0][1]*m[1][0]*m[2][3]*m[3][2] +
43 m[0][1]*m[1][2]*m[2][0]*m[3][3] -
44 m[0][1]*m[1][2]*m[2][3]*m[3][0] -
45 m[0][1]*m[1][3]*m[2][0]*m[3][2] +
46 m[0][1]*m[1][3]*m[2][2]*m[3][0] +
47 m[0][2]*m[1][0]*m[2][1]*m[3][3] -
48 m[0][2]*m[1][0]*m[2][3]*m[3][1] -
49 m[0][2]*m[1][1]*m[2][0]*m[3][3] +
50 m[0][2]*m[1][1]*m[2][3]*m[3][0] +
51 m[0][2]*m[1][3]*m[2][0]*m[3][1] -
52 m[0][2]*m[1][3]*m[2][1]*m[3][0] -
53 m[0][3]*m[1][0]*m[2][1]*m[3][2] +
54 m[0][3]*m[1][0]*m[2][2]*m[3][1] +
55 m[0][3]*m[1][1]*m[2][0]*m[3][2] -
56 m[0][3]*m[1][1]*m[2][2]*m[3][0] -
57 m[0][3]*m[1][2]*m[2][0]*m[3][1] +
58 m[0][3]*m[1][2]*m[2][1]*m[3][0]
59}
60
Rémy Oudompheng335eef82012-10-26 00:29:44 +020061// Compute the determinant of a 4x4-matrix by the sum
62// over all index permutations.
63func determinantInt(m [4][4]int) int {
64 return m[0][0]*m[1][1]*m[2][2]*m[3][3] -
65 m[0][0]*m[1][1]*m[2][3]*m[3][2] -
66 m[0][0]*m[1][2]*m[2][1]*m[3][3] +
67 m[0][0]*m[1][2]*m[2][3]*m[3][1] +
68 m[0][0]*m[1][3]*m[2][1]*m[3][2] -
69 m[0][0]*m[1][3]*m[2][2]*m[3][1] -
70 m[0][1]*m[1][0]*m[2][2]*m[3][3] +
71 m[0][1]*m[1][0]*m[2][3]*m[3][2] +
72 m[0][1]*m[1][2]*m[2][0]*m[3][3] -
73 m[0][1]*m[1][2]*m[2][3]*m[3][0] -
74 m[0][1]*m[1][3]*m[2][0]*m[3][2] +
75 m[0][1]*m[1][3]*m[2][2]*m[3][0] +
76 m[0][2]*m[1][0]*m[2][1]*m[3][3] -
77 m[0][2]*m[1][0]*m[2][3]*m[3][1] -
78 m[0][2]*m[1][1]*m[2][0]*m[3][3] +
79 m[0][2]*m[1][1]*m[2][3]*m[3][0] +
80 m[0][2]*m[1][3]*m[2][0]*m[3][1] -
81 m[0][2]*m[1][3]*m[2][1]*m[3][0] -
82 m[0][3]*m[1][0]*m[2][1]*m[3][2] +
83 m[0][3]*m[1][0]*m[2][2]*m[3][1] +
84 m[0][3]*m[1][1]*m[2][0]*m[3][2] -
85 m[0][3]*m[1][1]*m[2][2]*m[3][0] -
86 m[0][3]*m[1][2]*m[2][0]*m[3][1] +
87 m[0][3]*m[1][2]*m[2][1]*m[3][0]
88}
89
90// Compute the determinant of a 4x4-matrix by the sum
91// over all index permutations.
92func determinantByte(m [4][4]byte) byte {
93 return m[0][0]*m[1][1]*m[2][2]*m[3][3] -
94 m[0][0]*m[1][1]*m[2][3]*m[3][2] -
95 m[0][0]*m[1][2]*m[2][1]*m[3][3] +
96 m[0][0]*m[1][2]*m[2][3]*m[3][1] +
97 m[0][0]*m[1][3]*m[2][1]*m[3][2] -
98 m[0][0]*m[1][3]*m[2][2]*m[3][1] -
99 m[0][1]*m[1][0]*m[2][2]*m[3][3] +
100 m[0][1]*m[1][0]*m[2][3]*m[3][2] +
101 m[0][1]*m[1][2]*m[2][0]*m[3][3] -
102 m[0][1]*m[1][2]*m[2][3]*m[3][0] -
103 m[0][1]*m[1][3]*m[2][0]*m[3][2] +
104 m[0][1]*m[1][3]*m[2][2]*m[3][0] +
105 m[0][2]*m[1][0]*m[2][1]*m[3][3] -
106 m[0][2]*m[1][0]*m[2][3]*m[3][1] -
107 m[0][2]*m[1][1]*m[2][0]*m[3][3] +
108 m[0][2]*m[1][1]*m[2][3]*m[3][0] +
109 m[0][2]*m[1][3]*m[2][0]*m[3][1] -
110 m[0][2]*m[1][3]*m[2][1]*m[3][0] -
111 m[0][3]*m[1][0]*m[2][1]*m[3][2] +
112 m[0][3]*m[1][0]*m[2][2]*m[3][1] +
113 m[0][3]*m[1][1]*m[2][0]*m[3][2] -
114 m[0][3]*m[1][1]*m[2][2]*m[3][0] -
115 m[0][3]*m[1][2]*m[2][0]*m[3][1] +
116 m[0][3]*m[1][2]*m[2][1]*m[3][0]
117}
118
Rémy Oudompheng0b2353e2012-11-02 07:50:59 +0100119type A []A
120
121// A sequence of constant indexings.
122func IndexChain1(s A) A {
123 return s[0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0]
124}
125
126// A sequence of non-constant indexings.
127func IndexChain2(s A, i int) A {
128 return s[i][i][i][i][i][i][i][i][i][i][i][i][i][i][i][i]
129}
130
131// Another sequence of indexings.
132func IndexChain3(s []int) int {
133 return s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[0]]]]]]]]]]]]]]]]]]]]]
134}
135
Rémy Oudompheng3a4e1562012-10-05 23:30:49 +0200136// A right-leaning tree of byte multiplications.
137func righttree(a, b, c, d uint8) uint8 {
138 return a * (b * (c * (d *
139 (a * (b * (c * (d *
140 (a * (b * (c * (d *
141 (a * (b * (c * (d *
142 (a * (b * (c * (d *
143 a * (b * (c * d)))))))))))))))))))))
144
145}
146
147// A left-leaning tree of byte multiplications.
148func lefttree(a, b, c, d uint8) uint8 {
149 return ((((((((((((((((((a * b) * c) * d *
150 a) * b) * c) * d *
151 a) * b) * c) * d *
152 a) * b) * c) * d *
153 a) * b) * c) * d *
154 a) * b) * c) * d)
155}
156
157type T struct {
158 Next I
159}
160
161type I interface{}
162
163// A chains of type assertions.
164func ChainT(t *T) *T {
165 return t.
166 Next.(*T).
167 Next.(*T).
168 Next.(*T).
169 Next.(*T).
170 Next.(*T).
171 Next.(*T).
172 Next.(*T).
173 Next.(*T).
174 Next.(*T).
175 Next.(*T).
176 Next.(*T).
177 Next.(*T).
178 Next.(*T).
179 Next.(*T).
180 Next.(*T).
181 Next.(*T).
182 Next.(*T).
183 Next.(*T).
184 Next.(*T).
185 Next.(*T)
186}
187
188type U struct {
189 Children []J
190}
191
192func (u *U) Child(n int) J { return u.Children[n] }
193
194type J interface {
195 Child(n int) J
196}
197
198func ChainUAssert(u *U) *U {
199 return u.Child(0).(*U).
200 Child(0).(*U).
201 Child(0).(*U).
202 Child(0).(*U).
203 Child(0).(*U).
204 Child(0).(*U).
205 Child(0).(*U).
206 Child(0).(*U).
207 Child(0).(*U).
208 Child(0).(*U).
209 Child(0).(*U).
210 Child(0).(*U).
211 Child(0).(*U).
212 Child(0).(*U).
213 Child(0).(*U).
214 Child(0).(*U).
215 Child(0).(*U).
216 Child(0).(*U).
217 Child(0).(*U).
218 Child(0).(*U).
219 Child(0).(*U).
220 Child(0).(*U)
221}
222
223func ChainUNoAssert(u *U) *U {
224 return u.Child(0).
225 Child(0).
226 Child(0).
227 Child(0).
228 Child(0).
229 Child(0).
230 Child(0).
231 Child(0).
232 Child(0).
233 Child(0).
234 Child(0).
235 Child(0).
236 Child(0).
237 Child(0).
238 Child(0).
239 Child(0).
240 Child(0).
241 Child(0).
242 Child(0).
243 Child(0).
244 Child(0).
245 Child(0).(*U)
246}
Rémy Oudompheng46fcfda2012-10-07 00:30:29 +0200247
Rémy Oudompheng7e144bc2012-10-16 07:22:33 +0200248// Type assertions and slice indexing. See issue 4207.
249func ChainAssertIndex(u *U) J {
250 return u.
251 Children[0].(*U).
252 Children[0].(*U).
253 Children[0].(*U).
254 Children[0].(*U).
255 Children[0].(*U).
256 Children[0].(*U).
257 Children[0].(*U).
258 Children[0].(*U).
259 Children[0].(*U).
260 Children[0].(*U).
261 Children[0].(*U).
262 Children[0].(*U).
263 Children[0].(*U).
264 Children[0]
265}
266
267type UArr struct {
268 Children [2]J
269}
270
271func (u *UArr) Child(n int) J { return u.Children[n] }
272
273func ChainAssertArrayIndex(u *UArr) J {
274 return u.
275 Children[0].(*UArr).
276 Children[0].(*UArr).
277 Children[0].(*UArr).
278 Children[0].(*UArr).
279 Children[0].(*UArr).
280 Children[0].(*UArr).
281 Children[0].(*UArr).
Rémy Oudomphengeb4f4d12012-11-12 23:56:11 +0100282 Children[0].(*UArr).
283 Children[0].(*UArr).
284 Children[0].(*UArr).
285 Children[0].(*UArr).
286 Children[0].(*UArr).
287 Children[0].(*UArr).
Rémy Oudompheng7e144bc2012-10-16 07:22:33 +0200288 Children[0]
289}
290
291type UArrPtr struct {
292 Children *[2]J
293}
294
295func (u *UArrPtr) Child(n int) J { return u.Children[n] }
296
297func ChainAssertArrayptrIndex(u *UArrPtr) J {
Rémy Oudompheng7e144bc2012-10-16 07:22:33 +0200298 return u.
299 Children[0].(*UArrPtr).
300 Children[0].(*UArrPtr).
301 Children[0].(*UArrPtr).
302 Children[0].(*UArrPtr).
Rémy Oudomphengeb4f4d12012-11-12 23:56:11 +0100303 Children[0].(*UArrPtr).
304 Children[0].(*UArrPtr).
305 Children[0].(*UArrPtr).
306 Children[0].(*UArrPtr).
307 Children[0].(*UArrPtr).
308 Children[0].(*UArrPtr).
309 Children[0].(*UArrPtr).
310 Children[0].(*UArrPtr).
311 Children[0].(*UArrPtr).
Rémy Oudompheng7e144bc2012-10-16 07:22:33 +0200312 Children[0]
313}
314
Rémy Oudompheng46fcfda2012-10-07 00:30:29 +0200315// Chains of divisions. See issue 4201.
316
317func ChainDiv(a, b int) int {
318 return a / b / a / b / a / b / a / b /
319 a / b / a / b / a / b / a / b /
320 a / b / a / b / a / b / a / b
321}
322
323func ChainDivRight(a, b int) int {
324 return a / (b / (a / (b /
Rémy Oudompheng7e144bc2012-10-16 07:22:33 +0200325 (a / (b / (a / (b /
326 (a / (b / (a / (b /
327 (a / (b / (a / (b /
328 (a / (b / (a / b))))))))))))))))))
Rémy Oudompheng46fcfda2012-10-07 00:30:29 +0200329}
330
331func ChainDivConst(a int) int {
332 return a / 17 / 17 / 17 /
333 17 / 17 / 17 / 17 /
334 17 / 17 / 17 / 17
335}
Rémy Oudompheng4d3cbfd2012-12-21 23:46:16 +0100336
337func ChainMulBytes(a, b, c byte) byte {
338 return a*(a*(a*(a*(a*(a*(a*(a*(a*b+c)+c)+c)+c)+c)+c)+c)+c) + c
339}
Rémy Oudompheng1ec56062014-07-01 09:20:51 +0200340
341func ChainCap() {
342 select {
343 case <-make(chan int, cap(make(chan int, cap(make(chan int, cap(make(chan int, cap(make(chan int))))))))):
344 default:
345 }
346}