| // 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) { | |
| } | |