// Copyright 2016 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. package main // Test to make sure spills of cast-shortened values // don't end up spilling the pre-shortened size instead // of the post-shortened size. import ( "fmt" "runtime" ) // unfoldable true var true_ = true var data1 [26]int32 var data2 [26]int64 func init() { for i := 0; i < 26; i++ { // If we spill all 8 bytes of this datum, the 1 in the high-order 4 bytes // will overwrite some other variable in the stack frame. data2[i] = 0x100000000 } } func foo() int32 { var a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z int32 if true_ { a = data1[0] b = data1[1] c = data1[2] d = data1[3] e = data1[4] f = data1[5] g = data1[6] h = data1[7] i = data1[8] j = data1[9] k = data1[10] l = data1[11] m = data1[12] n = data1[13] o = data1[14] p = data1[15] q = data1[16] r = data1[17] s = data1[18] t = data1[19] u = data1[20] v = data1[21] w = data1[22] x = data1[23] y = data1[24] z = data1[25] } else { a = int32(data2[0]) b = int32(data2[1]) c = int32(data2[2]) d = int32(data2[3]) e = int32(data2[4]) f = int32(data2[5]) g = int32(data2[6]) h = int32(data2[7]) i = int32(data2[8]) j = int32(data2[9]) k = int32(data2[10]) l = int32(data2[11]) m = int32(data2[12]) n = int32(data2[13]) o = int32(data2[14]) p = int32(data2[15]) q = int32(data2[16]) r = int32(data2[17]) s = int32(data2[18]) t = int32(data2[19]) u = int32(data2[20]) v = int32(data2[21]) w = int32(data2[22]) x = int32(data2[23]) y = int32(data2[24]) z = int32(data2[25]) } // Lots of phis of the form phi(int32,int64) of type int32 happen here. // Some will be stack phis. For those stack phis, make sure the spill // of the second argument uses the phi's width (4 bytes), not its width // (8 bytes). Otherwise, a random stack slot gets clobbered. runtime.Gosched() return a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z } func main() { want := int32(0) got := foo() if got != want { fmt.Printf("want %d, got %d\n", want, got) panic("bad") } }