// compile // Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Various tests for expressions with high complexity. package main // Concatenate 16 4-bit integers into a 64-bit number. func concat(s *[16]byte) uint64 { r := (((((((((((((((uint64(s[0])<<4| uint64(s[1]))<<4| uint64(s[2]))<<4| uint64(s[3]))<<4| uint64(s[4]))<<4| uint64(s[5]))<<4| uint64(s[6]))<<4| uint64(s[7]))<<4| uint64(s[8]))<<4| uint64(s[9]))<<4| uint64(s[10]))<<4| uint64(s[11]))<<4| uint64(s[12]))<<4| uint64(s[13]))<<4| uint64(s[14]))<<4 | uint64(s[15])) return r } // Compute the determinant of a 4x4-matrix by the sum // over all index permutations. func determinant(m [4][4]float64) float64 { return m[0][0]*m[1][1]*m[2][2]*m[3][3] - m[0][0]*m[1][1]*m[2][3]*m[3][2] - m[0][0]*m[1][2]*m[2][1]*m[3][3] + m[0][0]*m[1][2]*m[2][3]*m[3][1] + m[0][0]*m[1][3]*m[2][1]*m[3][2] - m[0][0]*m[1][3]*m[2][2]*m[3][1] - m[0][1]*m[1][0]*m[2][2]*m[3][3] + m[0][1]*m[1][0]*m[2][3]*m[3][2] + m[0][1]*m[1][2]*m[2][0]*m[3][3] - m[0][1]*m[1][2]*m[2][3]*m[3][0] - m[0][1]*m[1][3]*m[2][0]*m[3][2] + m[0][1]*m[1][3]*m[2][2]*m[3][0] + m[0][2]*m[1][0]*m[2][1]*m[3][3] - m[0][2]*m[1][0]*m[2][3]*m[3][1] - m[0][2]*m[1][1]*m[2][0]*m[3][3] + m[0][2]*m[1][1]*m[2][3]*m[3][0] + m[0][2]*m[1][3]*m[2][0]*m[3][1] - m[0][2]*m[1][3]*m[2][1]*m[3][0] - m[0][3]*m[1][0]*m[2][1]*m[3][2] + m[0][3]*m[1][0]*m[2][2]*m[3][1] + m[0][3]*m[1][1]*m[2][0]*m[3][2] - m[0][3]*m[1][1]*m[2][2]*m[3][0] - m[0][3]*m[1][2]*m[2][0]*m[3][1] + m[0][3]*m[1][2]*m[2][1]*m[3][0] } // Compute the determinant of a 4x4-matrix by the sum // over all index permutations. func determinantInt(m [4][4]int) int { return m[0][0]*m[1][1]*m[2][2]*m[3][3] - m[0][0]*m[1][1]*m[2][3]*m[3][2] - m[0][0]*m[1][2]*m[2][1]*m[3][3] + m[0][0]*m[1][2]*m[2][3]*m[3][1] + m[0][0]*m[1][3]*m[2][1]*m[3][2] - m[0][0]*m[1][3]*m[2][2]*m[3][1] - m[0][1]*m[1][0]*m[2][2]*m[3][3] + m[0][1]*m[1][0]*m[2][3]*m[3][2] + m[0][1]*m[1][2]*m[2][0]*m[3][3] - m[0][1]*m[1][2]*m[2][3]*m[3][0] - m[0][1]*m[1][3]*m[2][0]*m[3][2] + m[0][1]*m[1][3]*m[2][2]*m[3][0] + m[0][2]*m[1][0]*m[2][1]*m[3][3] - m[0][2]*m[1][0]*m[2][3]*m[3][1] - m[0][2]*m[1][1]*m[2][0]*m[3][3] + m[0][2]*m[1][1]*m[2][3]*m[3][0] + m[0][2]*m[1][3]*m[2][0]*m[3][1] - m[0][2]*m[1][3]*m[2][1]*m[3][0] - m[0][3]*m[1][0]*m[2][1]*m[3][2] + m[0][3]*m[1][0]*m[2][2]*m[3][1] + m[0][3]*m[1][1]*m[2][0]*m[3][2] - m[0][3]*m[1][1]*m[2][2]*m[3][0] - m[0][3]*m[1][2]*m[2][0]*m[3][1] + m[0][3]*m[1][2]*m[2][1]*m[3][0] } // Compute the determinant of a 4x4-matrix by the sum // over all index permutations. func determinantByte(m [4][4]byte) byte { return m[0][0]*m[1][1]*m[2][2]*m[3][3] - m[0][0]*m[1][1]*m[2][3]*m[3][2] - m[0][0]*m[1][2]*m[2][1]*m[3][3] + m[0][0]*m[1][2]*m[2][3]*m[3][1] + m[0][0]*m[1][3]*m[2][1]*m[3][2] - m[0][0]*m[1][3]*m[2][2]*m[3][1] - m[0][1]*m[1][0]*m[2][2]*m[3][3] + m[0][1]*m[1][0]*m[2][3]*m[3][2] + m[0][1]*m[1][2]*m[2][0]*m[3][3] - m[0][1]*m[1][2]*m[2][3]*m[3][0] - m[0][1]*m[1][3]*m[2][0]*m[3][2] + m[0][1]*m[1][3]*m[2][2]*m[3][0] + m[0][2]*m[1][0]*m[2][1]*m[3][3] - m[0][2]*m[1][0]*m[2][3]*m[3][1] - m[0][2]*m[1][1]*m[2][0]*m[3][3] + m[0][2]*m[1][1]*m[2][3]*m[3][0] + m[0][2]*m[1][3]*m[2][0]*m[3][1] - m[0][2]*m[1][3]*m[2][1]*m[3][0] - m[0][3]*m[1][0]*m[2][1]*m[3][2] + m[0][3]*m[1][0]*m[2][2]*m[3][1] + m[0][3]*m[1][1]*m[2][0]*m[3][2] - m[0][3]*m[1][1]*m[2][2]*m[3][0] - m[0][3]*m[1][2]*m[2][0]*m[3][1] + m[0][3]*m[1][2]*m[2][1]*m[3][0] } type A []A // A sequence of constant indexings. func IndexChain1(s A) A { return s[0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0] } // A sequence of non-constant indexings. func IndexChain2(s A, i int) A { return s[i][i][i][i][i][i][i][i][i][i][i][i][i][i][i][i] } // Another sequence of indexings. func IndexChain3(s []int) int { return s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[0]]]]]]]]]]]]]]]]]]]]] } // A right-leaning tree of byte multiplications. func righttree(a, b, c, d uint8) uint8 { return a * (b * (c * (d * (a * (b * (c * (d * (a * (b * (c * (d * (a * (b * (c * (d * (a * (b * (c * (d * a * (b * (c * d))))))))))))))))))))) } // A left-leaning tree of byte multiplications. func lefttree(a, b, c, d uint8) uint8 { return ((((((((((((((((((a * b) * c) * d * a) * b) * c) * d * a) * b) * c) * d * a) * b) * c) * d * a) * b) * c) * d * a) * b) * c) * d) } type T struct { Next I } type I interface{} // A chains of type assertions. func ChainT(t *T) *T { return t. Next.(*T). Next.(*T). Next.(*T). Next.(*T). Next.(*T). Next.(*T). Next.(*T). Next.(*T). Next.(*T). Next.(*T). Next.(*T). Next.(*T). Next.(*T). Next.(*T). Next.(*T). Next.(*T). Next.(*T). Next.(*T). Next.(*T). Next.(*T) } type U struct { Children []J } func (u *U) Child(n int) J { return u.Children[n] } type J interface { Child(n int) J } func ChainUAssert(u *U) *U { return u.Child(0).(*U). Child(0).(*U). Child(0).(*U). Child(0).(*U). Child(0).(*U). Child(0).(*U). Child(0).(*U). Child(0).(*U). Child(0).(*U). Child(0).(*U). Child(0).(*U). Child(0).(*U). Child(0).(*U). Child(0).(*U). Child(0).(*U). Child(0).(*U). Child(0).(*U). Child(0).(*U). Child(0).(*U). Child(0).(*U). Child(0).(*U). Child(0).(*U) } func ChainUNoAssert(u *U) *U { return u.Child(0). Child(0). Child(0). Child(0). Child(0). Child(0). Child(0). Child(0). Child(0). Child(0). Child(0). Child(0). Child(0). Child(0). Child(0). Child(0). Child(0). Child(0). Child(0). Child(0). Child(0). Child(0).(*U) } // Type assertions and slice indexing. See issue 4207. func ChainAssertIndex(u *U) J { return u. Children[0].(*U). Children[0].(*U). Children[0].(*U). Children[0].(*U). Children[0].(*U). Children[0].(*U). Children[0].(*U). Children[0].(*U). Children[0].(*U). Children[0].(*U). Children[0].(*U). Children[0].(*U). Children[0].(*U). Children[0] } type UArr struct { Children [2]J } func (u *UArr) Child(n int) J { return u.Children[n] } func ChainAssertArrayIndex(u *UArr) J { return u. Children[0].(*UArr). Children[0].(*UArr). Children[0].(*UArr). Children[0].(*UArr). Children[0].(*UArr). Children[0].(*UArr). Children[0].(*UArr). Children[0].(*UArr). Children[0].(*UArr). Children[0].(*UArr). Children[0].(*UArr). Children[0].(*UArr). Children[0].(*UArr). Children[0] } type UArrPtr struct { Children *[2]J } func (u *UArrPtr) Child(n int) J { return u.Children[n] } func ChainAssertArrayptrIndex(u *UArrPtr) J { return u. Children[0].(*UArrPtr). Children[0].(*UArrPtr). Children[0].(*UArrPtr). Children[0].(*UArrPtr). Children[0].(*UArrPtr). Children[0].(*UArrPtr). Children[0].(*UArrPtr). Children[0].(*UArrPtr). Children[0].(*UArrPtr). Children[0].(*UArrPtr). Children[0].(*UArrPtr). Children[0].(*UArrPtr). Children[0].(*UArrPtr). Children[0] } // Chains of divisions. See issue 4201. func ChainDiv(a, b int) int { return a / b / a / b / a / b / a / b / a / b / a / b / a / b / a / b / a / b / a / b / a / b / a / b } func ChainDivRight(a, b int) int { return a / (b / (a / (b / (a / (b / (a / (b / (a / (b / (a / (b / (a / (b / (a / (b / (a / (b / (a / b)))))))))))))))))) } func ChainDivConst(a int) int { return a / 17 / 17 / 17 / 17 / 17 / 17 / 17 / 17 / 17 / 17 / 17 } func ChainMulBytes(a, b, c byte) byte { return a*(a*(a*(a*(a*(a*(a*(a*(a*b+c)+c)+c)+c)+c)+c)+c)+c) + c } func ChainCap() { select { case <-make(chan int, cap(make(chan int, cap(make(chan int, cap(make(chan int, cap(make(chan int))))))))): default: } }