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