Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.0.0-20201028153306-37f0764111ff / go / analysis / passes / atomic / testdata / src / a / a.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201028153306-37f0764111ff/go/analysis/passes/atomic/testdata/src/a/a.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201028153306-37f0764111ff/go/analysis/passes/atomic/testdata/src/a/a.go
new file mode 100644 (file)
index 0000000..dc12bd0
--- /dev/null
@@ -0,0 +1,62 @@
+// Copyright 2013 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 Counter uint64
+
+func AtomicTests() {
+       x := uint64(1)
+       x = atomic.AddUint64(&x, 1)        // want "direct assignment to atomic value"
+       _, x = 10, atomic.AddUint64(&x, 1) // want "direct assignment to atomic value"
+       x, _ = atomic.AddUint64(&x, 1), 10 // want "direct assignment to atomic value"
+
+       y := &x
+       *y = atomic.AddUint64(y, 1) // want "direct assignment to atomic value"
+
+       var su struct{ Counter uint64 }
+       su.Counter = atomic.AddUint64(&su.Counter, 1) // want "direct assignment to atomic value"
+       z1 := atomic.AddUint64(&su.Counter, 1)
+       _ = z1 // Avoid err "z declared and not used"
+
+       var sp struct{ Counter *uint64 }
+       *sp.Counter = atomic.AddUint64(sp.Counter, 1) // want "direct assignment to atomic value"
+       z2 := atomic.AddUint64(sp.Counter, 1)
+       _ = z2 // Avoid err "z declared and not used"
+
+       au := []uint64{10, 20}
+       au[0] = atomic.AddUint64(&au[0], 1) // want "direct assignment to atomic value"
+       au[1] = atomic.AddUint64(&au[0], 1)
+
+       ap := []*uint64{&au[0], &au[1]}
+       *ap[0] = atomic.AddUint64(ap[0], 1) // want "direct assignment to atomic value"
+       *ap[1] = atomic.AddUint64(ap[0], 1)
+
+       x = atomic.AddUint64() // Used to make vet crash; now silently ignored.
+
+       {
+               // A variable declaration creates a new variable in the current scope.
+               x := atomic.AddUint64(&x, 1)
+
+               // Re-declaration assigns a new value.
+               x, w := atomic.AddUint64(&x, 1), 10 // want "direct assignment to atomic value"
+               _ = w
+       }
+}
+
+type T struct{}
+
+func (T) AddUint64(addr *uint64, delta uint64) uint64 { return 0 }
+
+func NonAtomic() {
+       x := uint64(1)
+       var atomic T
+       x = atomic.AddUint64(&x, 1) // ok; not the imported pkg
+}