1258945Sroberto// compile
2280849Scy
3258945Sroberto// Copyright 2012 The Go Authors. All rights reserved.
4258945Sroberto// Use of this source code is governed by a BSD-style
5258945Sroberto// license that can be found in the LICENSE file.
6258945Sroberto
7258945Sroberto// Various tests for expressions with high complexity.
8258945Sroberto
9258945Srobertopackage main
10258945Sroberto
11258945Sroberto// Concatenate 16 4-bit integers into a 64-bit number.
12258945Srobertofunc concat(s *[16]byte) uint64 {
13258945Sroberto	r := (((((((((((((((uint64(s[0])<<4|
14258945Sroberto		uint64(s[1]))<<4|
15258945Sroberto		uint64(s[2]))<<4|
16258945Sroberto		uint64(s[3]))<<4|
17258945Sroberto		uint64(s[4]))<<4|
18280849Scy		uint64(s[5]))<<4|
19258945Sroberto		uint64(s[6]))<<4|
20258945Sroberto		uint64(s[7]))<<4|
21258945Sroberto		uint64(s[8]))<<4|
22258945Sroberto		uint64(s[9]))<<4|
23258945Sroberto		uint64(s[10]))<<4|
24258945Sroberto		uint64(s[11]))<<4|
25258945Sroberto		uint64(s[12]))<<4|
26258945Sroberto		uint64(s[13]))<<4|
27258945Sroberto		uint64(s[14]))<<4 |
28258945Sroberto		uint64(s[15]))
29258945Sroberto	return r
30258945Sroberto}
31258945Sroberto
32258945Sroberto// Compute the determinant of a 4x4-matrix by the sum
33258945Sroberto// over all index permutations.
34258945Srobertofunc determinant(m [4][4]float64) float64 {
35258945Sroberto	return m[0][0]*m[1][1]*m[2][2]*m[3][3] -
36258945Sroberto		m[0][0]*m[1][1]*m[2][3]*m[3][2] -
37258945Sroberto		m[0][0]*m[1][2]*m[2][1]*m[3][3] +
38258945Sroberto		m[0][0]*m[1][2]*m[2][3]*m[3][1] +
39258945Sroberto		m[0][0]*m[1][3]*m[2][1]*m[3][2] -
40258945Sroberto		m[0][0]*m[1][3]*m[2][2]*m[3][1] -
41258945Sroberto		m[0][1]*m[1][0]*m[2][2]*m[3][3] +
42258945Sroberto		m[0][1]*m[1][0]*m[2][3]*m[3][2] +
43258945Sroberto		m[0][1]*m[1][2]*m[2][0]*m[3][3] -
44258945Sroberto		m[0][1]*m[1][2]*m[2][3]*m[3][0] -
45258945Sroberto		m[0][1]*m[1][3]*m[2][0]*m[3][2] +
46258945Sroberto		m[0][1]*m[1][3]*m[2][2]*m[3][0] +
47258945Sroberto		m[0][2]*m[1][0]*m[2][1]*m[3][3] -
48258945Sroberto		m[0][2]*m[1][0]*m[2][3]*m[3][1] -
49258945Sroberto		m[0][2]*m[1][1]*m[2][0]*m[3][3] +
50258945Sroberto		m[0][2]*m[1][1]*m[2][3]*m[3][0] +
51258945Sroberto		m[0][2]*m[1][3]*m[2][0]*m[3][1] -
52258945Sroberto		m[0][2]*m[1][3]*m[2][1]*m[3][0] -
53258945Sroberto		m[0][3]*m[1][0]*m[2][1]*m[3][2] +
54258945Sroberto		m[0][3]*m[1][0]*m[2][2]*m[3][1] +
55258945Sroberto		m[0][3]*m[1][1]*m[2][0]*m[3][2] -
56258945Sroberto		m[0][3]*m[1][1]*m[2][2]*m[3][0] -
57258945Sroberto		m[0][3]*m[1][2]*m[2][0]*m[3][1] +
58258945Sroberto		m[0][3]*m[1][2]*m[2][1]*m[3][0]
59258945Sroberto}
60258945Sroberto
61258945Sroberto// Compute the determinant of a 4x4-matrix by the sum
62258945Sroberto// over all index permutations.
63258945Srobertofunc determinantInt(m [4][4]int) int {
64258945Sroberto	return m[0][0]*m[1][1]*m[2][2]*m[3][3] -
65258945Sroberto		m[0][0]*m[1][1]*m[2][3]*m[3][2] -
66258945Sroberto		m[0][0]*m[1][2]*m[2][1]*m[3][3] +
67258945Sroberto		m[0][0]*m[1][2]*m[2][3]*m[3][1] +
68258945Sroberto		m[0][0]*m[1][3]*m[2][1]*m[3][2] -
69258945Sroberto		m[0][0]*m[1][3]*m[2][2]*m[3][1] -
70258945Sroberto		m[0][1]*m[1][0]*m[2][2]*m[3][3] +
71258945Sroberto		m[0][1]*m[1][0]*m[2][3]*m[3][2] +
72258945Sroberto		m[0][1]*m[1][2]*m[2][0]*m[3][3] -
73258945Sroberto		m[0][1]*m[1][2]*m[2][3]*m[3][0] -
74258945Sroberto		m[0][1]*m[1][3]*m[2][0]*m[3][2] +
75258945Sroberto		m[0][1]*m[1][3]*m[2][2]*m[3][0] +
76258945Sroberto		m[0][2]*m[1][0]*m[2][1]*m[3][3] -
77258945Sroberto		m[0][2]*m[1][0]*m[2][3]*m[3][1] -
78258945Sroberto		m[0][2]*m[1][1]*m[2][0]*m[3][3] +
79258945Sroberto		m[0][2]*m[1][1]*m[2][3]*m[3][0] +
80258945Sroberto		m[0][2]*m[1][3]*m[2][0]*m[3][1] -
81258945Sroberto		m[0][2]*m[1][3]*m[2][1]*m[3][0] -
82258945Sroberto		m[0][3]*m[1][0]*m[2][1]*m[3][2] +
83258945Sroberto		m[0][3]*m[1][0]*m[2][2]*m[3][1] +
84258945Sroberto		m[0][3]*m[1][1]*m[2][0]*m[3][2] -
85258945Sroberto		m[0][3]*m[1][1]*m[2][2]*m[3][0] -
86258945Sroberto		m[0][3]*m[1][2]*m[2][0]*m[3][1] +
87258945Sroberto		m[0][3]*m[1][2]*m[2][1]*m[3][0]
88258945Sroberto}
89258945Sroberto
90258945Sroberto// Compute the determinant of a 4x4-matrix by the sum
91258945Sroberto// over all index permutations.
92258945Srobertofunc determinantByte(m [4][4]byte) byte {
93258945Sroberto	return m[0][0]*m[1][1]*m[2][2]*m[3][3] -
94258945Sroberto		m[0][0]*m[1][1]*m[2][3]*m[3][2] -
95258945Sroberto		m[0][0]*m[1][2]*m[2][1]*m[3][3] +
96258945Sroberto		m[0][0]*m[1][2]*m[2][3]*m[3][1] +
97258945Sroberto		m[0][0]*m[1][3]*m[2][1]*m[3][2] -
98258945Sroberto		m[0][0]*m[1][3]*m[2][2]*m[3][1] -
99258945Sroberto		m[0][1]*m[1][0]*m[2][2]*m[3][3] +
100258945Sroberto		m[0][1]*m[1][0]*m[2][3]*m[3][2] +
101258945Sroberto		m[0][1]*m[1][2]*m[2][0]*m[3][3] -
102258945Sroberto		m[0][1]*m[1][2]*m[2][3]*m[3][0] -
103258945Sroberto		m[0][1]*m[1][3]*m[2][0]*m[3][2] +
104258945Sroberto		m[0][1]*m[1][3]*m[2][2]*m[3][0] +
105258945Sroberto		m[0][2]*m[1][0]*m[2][1]*m[3][3] -
106258945Sroberto		m[0][2]*m[1][0]*m[2][3]*m[3][1] -
107258945Sroberto		m[0][2]*m[1][1]*m[2][0]*m[3][3] +
108258945Sroberto		m[0][2]*m[1][1]*m[2][3]*m[3][0] +
109258945Sroberto		m[0][2]*m[1][3]*m[2][0]*m[3][1] -
110258945Sroberto		m[0][2]*m[1][3]*m[2][1]*m[3][0] -
111258945Sroberto		m[0][3]*m[1][0]*m[2][1]*m[3][2] +
112258945Sroberto		m[0][3]*m[1][0]*m[2][2]*m[3][1] +
113258945Sroberto		m[0][3]*m[1][1]*m[2][0]*m[3][2] -
114258945Sroberto		m[0][3]*m[1][1]*m[2][2]*m[3][0] -
115258945Sroberto		m[0][3]*m[1][2]*m[2][0]*m[3][1] +
116258945Sroberto		m[0][3]*m[1][2]*m[2][1]*m[3][0]
117258945Sroberto}
118258945Sroberto
119258945Srobertotype A []A
120258945Sroberto
121258945Sroberto// A sequence of constant indexings.
122258945Srobertofunc IndexChain1(s A) A {
123258945Sroberto	return s[0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0]
124280849Scy}
125258945Sroberto
126258945Sroberto// A sequence of non-constant indexings.
127258945Srobertofunc IndexChain2(s A, i int) A {
128258945Sroberto	return s[i][i][i][i][i][i][i][i][i][i][i][i][i][i][i][i]
129258945Sroberto}
130258945Sroberto
131258945Sroberto// Another sequence of indexings.
132258945Srobertofunc IndexChain3(s []int) int {
133258945Sroberto	return s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[0]]]]]]]]]]]]]]]]]]]]]
134258945Sroberto}
135258945Sroberto
136258945Sroberto// A right-leaning tree of byte multiplications.
137258945Srobertofunc righttree(a, b, c, d uint8) uint8 {
138258945Sroberto	return a * (b * (c * (d *
139258945Sroberto		(a * (b * (c * (d *
140258945Sroberto			(a * (b * (c * (d *
141258945Sroberto				(a * (b * (c * (d *
142258945Sroberto					(a * (b * (c * (d *
143258945Sroberto						a * (b * (c * d)))))))))))))))))))))
144258945Sroberto
145258945Sroberto}
146258945Sroberto
147258945Sroberto// A left-leaning tree of byte multiplications.
148258945Srobertofunc lefttree(a, b, c, d uint8) uint8 {
149258945Sroberto	return ((((((((((((((((((a * b) * c) * d *
150258945Sroberto		a) * b) * c) * d *
151258945Sroberto		a) * b) * c) * d *
152258945Sroberto		a) * b) * c) * d *
153258945Sroberto		a) * b) * c) * d *
154258945Sroberto		a) * b) * c) * d)
155280849Scy}
156280849Scy
157280849Scytype T struct {
158280849Scy	Next I
159280849Scy}
160280849Scy
161280849Scytype I interface{}
162280849Scy
163280849Scy// A chains of type assertions.
164280849Scyfunc ChainT(t *T) *T {
165280849Scy	return t.
166280849Scy		Next.(*T).
167280849Scy		Next.(*T).
168280849Scy		Next.(*T).
169280849Scy		Next.(*T).
170280849Scy		Next.(*T).
171280849Scy		Next.(*T).
172258945Sroberto		Next.(*T).
173280849Scy		Next.(*T).
174280849Scy		Next.(*T).
175280849Scy		Next.(*T).
176280849Scy		Next.(*T).
177280849Scy		Next.(*T).
178280849Scy		Next.(*T).
179258945Sroberto		Next.(*T).
180258945Sroberto		Next.(*T).
181258945Sroberto		Next.(*T).
182258945Sroberto		Next.(*T).
183258945Sroberto		Next.(*T).
184258945Sroberto		Next.(*T).
185258945Sroberto		Next.(*T)
186258945Sroberto}
187258945Sroberto
188258945Srobertotype U struct {
189258945Sroberto	Children []J
190258945Sroberto}
191258945Sroberto
192258945Srobertofunc (u *U) Child(n int) J { return u.Children[n] }
193258945Sroberto
194258945Srobertotype J interface {
195258945Sroberto	Child(n int) J
196258945Sroberto}
197258945Sroberto
198258945Srobertofunc ChainUAssert(u *U) *U {
199258945Sroberto	return u.Child(0).(*U).
200258945Sroberto		Child(0).(*U).
201258945Sroberto		Child(0).(*U).
202258945Sroberto		Child(0).(*U).
203258945Sroberto		Child(0).(*U).
204258945Sroberto		Child(0).(*U).
205258945Sroberto		Child(0).(*U).
206258945Sroberto		Child(0).(*U).
207258945Sroberto		Child(0).(*U).
208280849Scy		Child(0).(*U).
209280849Scy		Child(0).(*U).
210280849Scy		Child(0).(*U).
211280849Scy		Child(0).(*U).
212280849Scy		Child(0).(*U).
213280849Scy		Child(0).(*U).
214280849Scy		Child(0).(*U).
215280849Scy		Child(0).(*U).
216280849Scy		Child(0).(*U).
217280849Scy		Child(0).(*U).
218280849Scy		Child(0).(*U).
219280849Scy		Child(0).(*U).
220280849Scy		Child(0).(*U)
221280849Scy}
222280849Scy
223280849Scyfunc ChainUNoAssert(u *U) *U {
224280849Scy	return u.Child(0).
225280849Scy		Child(0).
226280849Scy		Child(0).
227280849Scy		Child(0).
228280849Scy		Child(0).
229280849Scy		Child(0).
230280849Scy		Child(0).
231280849Scy		Child(0).
232280849Scy		Child(0).
233280849Scy		Child(0).
234280849Scy		Child(0).
235280849Scy		Child(0).
236280849Scy		Child(0).
237280849Scy		Child(0).
238280849Scy		Child(0).
239280849Scy		Child(0).
240280849Scy		Child(0).
241280849Scy		Child(0).
242280849Scy		Child(0).
243280849Scy		Child(0).
244280849Scy		Child(0).
245280849Scy		Child(0).(*U)
246280849Scy}
247280849Scy
248280849Scy// Type assertions and slice indexing. See issue 4207.
249280849Scyfunc ChainAssertIndex(u *U) J {
250280849Scy	return u.
251280849Scy		Children[0].(*U).
252280849Scy		Children[0].(*U).
253280849Scy		Children[0].(*U).
254280849Scy		Children[0].(*U).
255280849Scy		Children[0].(*U).
256280849Scy		Children[0].(*U).
257280849Scy		Children[0].(*U).
258280849Scy		Children[0].(*U).
259280849Scy		Children[0].(*U).
260280849Scy		Children[0].(*U).
261280849Scy		Children[0].(*U).
262280849Scy		Children[0].(*U).
263280849Scy		Children[0].(*U).
264280849Scy		Children[0]
265280849Scy}
266280849Scy
267280849Scytype UArr struct {
268280849Scy	Children [2]J
269280849Scy}
270280849Scy
271280849Scyfunc (u *UArr) Child(n int) J { return u.Children[n] }
272280849Scy
273280849Scyfunc ChainAssertArrayIndex(u *UArr) J {
274280849Scy	return u.
275280849Scy		Children[0].(*UArr).
276280849Scy		Children[0].(*UArr).
277258945Sroberto		Children[0].(*UArr).
278258945Sroberto		Children[0].(*UArr).
279258945Sroberto		Children[0].(*UArr).
280280849Scy		Children[0].(*UArr).
281258945Sroberto		Children[0].(*UArr).
282258945Sroberto		Children[0].(*UArr).
283258945Sroberto		Children[0].(*UArr).
284258945Sroberto		Children[0].(*UArr).
285280849Scy		Children[0].(*UArr).
286258945Sroberto		Children[0].(*UArr).
287258945Sroberto		Children[0].(*UArr).
288258945Sroberto		Children[0]
289258945Sroberto}
290280849Scy
291258945Srobertotype UArrPtr struct {
292258945Sroberto	Children *[2]J
293258945Sroberto}
294258945Sroberto
295280849Scyfunc (u *UArrPtr) Child(n int) J { return u.Children[n] }
296258945Sroberto
297258945Srobertofunc ChainAssertArrayptrIndex(u *UArrPtr) J {
298258945Sroberto	return u.
299280849Scy		Children[0].(*UArrPtr).
300258945Sroberto		Children[0].(*UArrPtr).
301280849Scy		Children[0].(*UArrPtr).
302280849Scy		Children[0].(*UArrPtr).
303280849Scy		Children[0].(*UArrPtr).
304258945Sroberto		Children[0].(*UArrPtr).
305258945Sroberto		Children[0].(*UArrPtr).
306258945Sroberto		Children[0].(*UArrPtr).
307258945Sroberto		Children[0].(*UArrPtr).
308258945Sroberto		Children[0].(*UArrPtr).
309258945Sroberto		Children[0].(*UArrPtr).
310258945Sroberto		Children[0].(*UArrPtr).
311258945Sroberto		Children[0].(*UArrPtr).
312258945Sroberto		Children[0]
313258945Sroberto}
314258945Sroberto
315258945Sroberto// Chains of divisions. See issue 4201.
316258945Sroberto
317258945Srobertofunc ChainDiv(a, b int) int {
318258945Sroberto	return a / b / a / b / a / b / a / b /
319258945Sroberto		a / b / a / b / a / b / a / b /
320258945Sroberto		a / b / a / b / a / b / a / b
321258945Sroberto}
322258945Sroberto
323258945Srobertofunc ChainDivRight(a, b int) int {
324258945Sroberto	return a / (b / (a / (b /
325258945Sroberto		(a / (b / (a / (b /
326258945Sroberto			(a / (b / (a / (b /
327258945Sroberto				(a / (b / (a / (b /
328258945Sroberto					(a / (b / (a / b))))))))))))))))))
329258945Sroberto}
330258945Sroberto
331258945Srobertofunc ChainDivConst(a int) int {
332258945Sroberto	return a / 17 / 17 / 17 /
333258945Sroberto		17 / 17 / 17 / 17 /
334258945Sroberto		17 / 17 / 17 / 17
335258945Sroberto}
336258945Sroberto
337280849Scyfunc ChainMulBytes(a, b, c byte) byte {
338258945Sroberto	return a*(a*(a*(a*(a*(a*(a*(a*(a*b+c)+c)+c)+c)+c)+c)+c)+c) + c
339258945Sroberto}
340258945Sroberto