github.com/mh-cbon/go@v0.0.0-20160603070303-9e112a3fe4c0/src/cmd/vet/testdata/copylock.go (about)

     1  package testdata
     2  
     3  import (
     4  	"sync"
     5  	"sync/atomic"
     6  )
     7  
     8  func OkFunc() {
     9  	var x *sync.Mutex
    10  	p := x
    11  	var y sync.Mutex
    12  	p = &y
    13  
    14  	var z = sync.Mutex{}
    15  	w := sync.Mutex{}
    16  
    17  	w = sync.Mutex{}
    18  	q := struct{ L sync.Mutex }{
    19  		L: sync.Mutex{},
    20  	}
    21  
    22  	yy := []Tlock{
    23  		Tlock{},
    24  		Tlock{
    25  			once: sync.Once{},
    26  		},
    27  	}
    28  
    29  	nl := new(sync.Mutex)
    30  	mx := make([]sync.Mutex, 10)
    31  	xx := struct{ L *sync.Mutex }{
    32  		L: new(sync.Mutex),
    33  	}
    34  }
    35  
    36  type Tlock struct {
    37  	once sync.Once
    38  }
    39  
    40  func BadFunc() {
    41  	var x *sync.Mutex
    42  	p := x
    43  	var y sync.Mutex
    44  	p = &y
    45  	*p = *x // ERROR "assignment copies lock value to \*p: sync.Mutex"
    46  
    47  	var t Tlock
    48  	var tp *Tlock
    49  	tp = &t
    50  	*tp = t // ERROR "assignment copies lock value to \*tp: testdata.Tlock contains sync.Once contains sync.Mutex"
    51  	t = *tp // ERROR "assignment copies lock value to t: testdata.Tlock contains sync.Once contains sync.Mutex"
    52  
    53  	y := *x   // ERROR "assignment copies lock value to y: sync.Mutex"
    54  	var z = t // ERROR "variable declaration copies lock value to z: testdata.Tlock contains sync.Once contains sync.Mutex"
    55  
    56  	w := struct{ L sync.Mutex }{
    57  		L: *x, // ERROR "literal copies lock value from \*x: sync.Mutex"
    58  	}
    59  	var q = map[int]Tlock{
    60  		1: t,   // ERROR "literal copies lock value from t: testdata.Tlock contains sync.Once contains sync.Mutex"
    61  		2: *tp, // ERROR "literal copies lock value from \*tp: testdata.Tlock contains sync.Once contains sync.Mutex"
    62  	}
    63  	yy := []Tlock{
    64  		t,   // ERROR "literal copies lock value from t: testdata.Tlock contains sync.Once contains sync.Mutex"
    65  		*tp, // ERROR "literal copies lock value from \*tp: testdata.Tlock contains sync.Once contains sync.Mutex"
    66  	}
    67  
    68  	// override 'new' keyword
    69  	new := func(interface{}) {}
    70  	new(t) // ERROR "function call copies lock value: testdata.Tlock contains sync.Once contains sync.Mutex"
    71  }
    72  
    73  // SyncTypesCheck checks copying of sync.* types except sync.Mutex
    74  func SyncTypesCheck() {
    75  	// sync.RWMutex copying
    76  	var rwmuX sync.RWMutex
    77  	var rwmuXX = sync.RWMutex{}
    78  	rwmuX1 := new(sync.RWMutex)
    79  	rwmuY := rwmuX     // ERROR "assignment copies lock value to rwmuY: sync.RWMutex"
    80  	rwmuY = rwmuX      // ERROR "assignment copies lock value to rwmuY: sync.RWMutex"
    81  	var rwmuYY = rwmuX // ERROR "variable declaration copies lock value to rwmuYY: sync.RWMutex"
    82  	rwmuP := &rwmuX
    83  	rwmuZ := &sync.RWMutex{}
    84  
    85  	// sync.Cond copying
    86  	var condX sync.Cond
    87  	var condXX = sync.Cond{}
    88  	condX1 := new(sync.Cond)
    89  	condY := condX     // ERROR "assignment copies lock value to condY: sync.Cond contains sync.noCopy"
    90  	condY = condX      // ERROR "assignment copies lock value to condY: sync.Cond contains sync.noCopy"
    91  	var condYY = condX // ERROR "variable declaration copies lock value to condYY: sync.Cond contains sync.noCopy"
    92  	condP := &condX
    93  	condZ := &sync.Cond{
    94  		L: &sync.Mutex{},
    95  	}
    96  	condZ = sync.NewCond(&sync.Mutex{})
    97  
    98  	// sync.WaitGroup copying
    99  	var wgX sync.WaitGroup
   100  	var wgXX = sync.WaitGroup{}
   101  	wgX1 := new(sync.WaitGroup)
   102  	wgY := wgX     // ERROR "assignment copies lock value to wgY: sync.WaitGroup contains sync.noCopy"
   103  	wgY = wgX      // ERROR "assignment copies lock value to wgY: sync.WaitGroup contains sync.noCopy"
   104  	var wgYY = wgX // ERROR "variable declaration copies lock value to wgYY: sync.WaitGroup contains sync.noCopy"
   105  	wgP := &wgX
   106  	wgZ := &sync.WaitGroup{}
   107  
   108  	// sync.Pool copying
   109  	var poolX sync.Pool
   110  	var poolXX = sync.Pool{}
   111  	poolX1 := new(sync.Pool)
   112  	poolY := poolX     // ERROR "assignment copies lock value to poolY: sync.Pool contains sync.noCopy"
   113  	poolY = poolX      // ERROR "assignment copies lock value to poolY: sync.Pool contains sync.noCopy"
   114  	var poolYY = poolX // ERROR "variable declaration copies lock value to poolYY: sync.Pool contains sync.noCopy"
   115  	poolP := &poolX
   116  	poolZ := &sync.Pool{}
   117  
   118  	// sync.Once copying
   119  	var onceX sync.Once
   120  	var onceXX = sync.Once{}
   121  	onceX1 := new(sync.Once)
   122  	onceY := onceX     // ERROR "assignment copies lock value to onceY: sync.Once contains sync.Mutex"
   123  	onceY = onceX      // ERROR "assignment copies lock value to onceY: sync.Once contains sync.Mutex"
   124  	var onceYY = onceX // ERROR "variable declaration copies lock value to onceYY: sync.Once contains sync.Mutex"
   125  	onceP := &onceX
   126  	onceZ := &sync.Once{}
   127  }
   128  
   129  // AtomicTypesCheck checks copying of sync/atomic types
   130  func AtomicTypesCheck() {
   131  	// atomic.Value copying
   132  	var vX atomic.Value
   133  	var vXX = atomic.Value{}
   134  	vX1 := new(atomic.Value)
   135  	vY := vX     // ERROR "assignment copies lock value to vY: sync/atomic.Value contains sync/atomic.noCopy"
   136  	vY = vX      // ERROR "assignment copies lock value to vY: sync/atomic.Value contains sync/atomic.noCopy"
   137  	var vYY = vX // ERROR "variable declaration copies lock value to vYY: sync/atomic.Value contains sync/atomic.noCopy"
   138  	vP := &vX
   139  	vZ := &atomic.Value{}
   140  }