1// run 2 3// Copyright 2016 The Go Authors. All rights reserved. 4// Use of this source code is governed by a BSD-style 5// license that can be found in the LICENSE file. 6 7// Check that we do loads exactly once. The SSA backend 8// once tried to do the load in f twice, once sign extended 9// and once zero extended. This can cause problems in 10// racy code, particularly sync/mutex. 11 12package main 13 14func f(p *byte) bool { 15 x := *p 16 a := int64(int8(x)) 17 b := int64(uint8(x)) 18 return a == b 19} 20 21func main() { 22 var x byte 23 const N = 1000000 24 c := make(chan struct{}) 25 go func() { 26 for i := 0; i < N; i++ { 27 x = 1 28 } 29 c <- struct{}{} 30 }() 31 go func() { 32 for i := 0; i < N; i++ { 33 x = 2 34 } 35 c <- struct{}{} 36 }() 37 38 for i := 0; i < N; i++ { 39 if !f(&x) { 40 panic("non-atomic load!") 41 } 42 } 43 <-c 44 <-c 45} 46