| // Copyright 2021 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. |
| |
| // This file contains tests for the atomic checker. |
| |
| package a |
| |
| import ( |
| "sync/atomic" |
| ) |
| |
| type Subtractable interface { |
| ~int64 |
| } |
| |
| func Sub[T Subtractable](addr *T, delta T) T { |
| // the followings result in type errors, but doesn't stop this vet check |
| *addr = atomic.AddInt64(addr, -delta) // want "direct assignment to atomic value" |
| *addr = atomic.AddUintptr(addr, delta) // want "direct assignment to atomic value" |
| atomic.AddInt64() // vet ignores it |
| return *addr |
| } |
| |
| type _S[T Subtractable] struct { |
| x *T |
| } |
| |
| func (v _S) AddInt64(_ *int64, delta int64) int64 { |
| *v.x = atomic.AddInt64(v.x, delta) // want "direct assignment to atomic value" |
| return *v.x |
| } |
| |
| func NonAtomicInt64() { |
| var atomic _S[int64] |
| *atomic.x = atomic.AddInt64(atomic.x, 123) // ok; AddInt64 is not sync/atomic.AddInt64. |
| } |