|  | // 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: | 
|  | } | 
|  | } |