github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/src/cmd/vet/test_atomic.go (about)

     1  // Copyright 2013 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // +build vet_test
     6  
     7  // This file contains tests for the atomic checker.
     8  
     9  package main
    10  
    11  import (
    12  	"sync/atomic"
    13  )
    14  
    15  type Counter uint64
    16  
    17  func AtomicTests() {
    18  	x := uint64(1)
    19  	x = atomic.AddUint64(&x, 1)        // ERROR "direct assignment to atomic value"
    20  	_, x = 10, atomic.AddUint64(&x, 1) // ERROR "direct assignment to atomic value"
    21  	x, _ = atomic.AddUint64(&x, 1), 10 // ERROR "direct assignment to atomic value"
    22  
    23  	y := &x
    24  	*y = atomic.AddUint64(y, 1) // ERROR "direct assignment to atomic value"
    25  
    26  	var su struct{ Counter uint64 }
    27  	su.Counter = atomic.AddUint64(&su.Counter, 1) // ERROR "direct assignment to atomic value"
    28  	z1 := atomic.AddUint64(&su.Counter, 1)
    29  	_ = z1 // Avoid err "z declared and not used"
    30  
    31  	var sp struct{ Counter *uint64 }
    32  	*sp.Counter = atomic.AddUint64(sp.Counter, 1) // ERROR "direct assignment to atomic value"
    33  	z2 := atomic.AddUint64(sp.Counter, 1)
    34  	_ = z2 // Avoid err "z declared and not used"
    35  
    36  	au := []uint64{10, 20}
    37  	au[0] = atomic.AddUint64(&au[0], 1) // ERROR "direct assignment to atomic value"
    38  	au[1] = atomic.AddUint64(&au[0], 1)
    39  
    40  	ap := []*uint64{&au[0], &au[1]}
    41  	*ap[0] = atomic.AddUint64(ap[0], 1) // ERROR "direct assignment to atomic value"
    42  	*ap[1] = atomic.AddUint64(ap[0], 1)
    43  }