// run // Copyright 2018 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 import ( "sync/atomic" ) var cnt32 int32 //go:noinline func test32(a, b []int) bool { // Try to generate flag value, issue atomic // adds and then re-use the flag value to see if // the atomic add has clobbered them. atomic.AddInt32(&cnt32, 1) if len(a) == len(b) { atomic.AddInt32(&cnt32, 2) } atomic.AddInt32(&cnt32, 4) if len(a) >= len(b) { atomic.AddInt32(&cnt32, 8) } if len(a) <= len(b) { atomic.AddInt32(&cnt32, 16) } return atomic.LoadInt32(&cnt32) == 31 } var cnt64 int64 //go:noinline func test64(a, b []int) bool { // Try to generate flag value, issue atomic // adds and then re-use the flag value to see if // the atomic add has clobbered them. atomic.AddInt64(&cnt64, 1) if len(a) == len(b) { atomic.AddInt64(&cnt64, 2) } atomic.AddInt64(&cnt64, 4) if len(a) >= len(b) { atomic.AddInt64(&cnt64, 8) } if len(a) <= len(b) { atomic.AddInt64(&cnt64, 16) } return atomic.LoadInt64(&cnt64) == 31 } func main() { if !test32([]int{}, []int{}) { panic("test32") } if !test64([]int{}, []int{}) { panic("test64") } }