modernc.org/gc@v1.0.1-0.20240304020402-f0dba7c97c2b/testdata/errchk/test/atomicload.go (about) 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 12 package main 13 14 func f(p *byte) bool { 15 x := *p 16 a := int64(int8(x)) 17 b := int64(uint8(x)) 18 return a == b 19 } 20 21 func 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 }