mirror of
				https://github.com/golang/go.git
				synced 2025-10-31 16:50:58 +00:00 
			
		
		
		
	 8a2891fc56
			
		
	
	
		8a2891fc56
		
	
	
	
	
		
			
			Affects receive using := when new variable escapes to heap. Fixes #1468. R=ken2 CC=golang-dev https://golang.org/cl/4119052
		
			
				
	
	
		
			45 lines
		
	
	
	
		
			996 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
	
		
			996 B
		
	
	
	
		
			Go
		
	
	
	
	
	
| // $G $D/$F.go && $L $F.$A && ./$A.out
 | |
| 
 | |
| // 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) {
 | |
| }
 | |
| 
 |