// run // Copyright 2011 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 func main() { c := make(chan int, 1) dummy := make(chan int) v := 0x12345678 for i := 0; i < 10; i++ { // 6g had a bug that caused select to pass &t to // selectrecv before allocating the memory for t, // which caused non-deterministic crashes. // This test looks for the bug by checking that the // value received actually ends up in t. // If the allocation happens after storing through // whatever garbage &t holds, the later reference // to t in the case body will use the new pointer and // not see the received value. v += 0x1020304 c <- v select { case t := <-c: go func() { f(t) }() escape(&t) if t != v { println(i, v, t) panic("wrong values") } case dummy <- 1: } } } func escape(*int) { } func f(int) { }