21 q := struct{ L sync.Mutex }{
33 mx := make([]sync.Mutex, 10)
34 xx := struct{ L *sync.Mutex }{
48 *p = *x // want `assignment copies lock value to \*p: sync.Mutex`
53 *tp = t // want `assignment copies lock value to \*tp: a.Tlock contains sync.Once contains sync.Mutex`
54 t = *tp // want "assignment copies lock value to t: a.Tlock contains sync.Once contains sync.Mutex"
56 y := *x // want "assignment copies lock value to y: sync.Mutex"
57 var z = t // want "variable declaration copies lock value to z: a.Tlock contains sync.Once contains sync.Mutex"
59 w := struct{ L sync.Mutex }{
60 L: *x, // want `literal copies lock value from \*x: sync.Mutex`
62 var q = map[int]Tlock{
63 1: t, // want "literal copies lock value from t: a.Tlock contains sync.Once contains sync.Mutex"
64 2: *tp, // want `literal copies lock value from \*tp: a.Tlock contains sync.Once contains sync.Mutex`
67 t, // want "literal copies lock value from t: a.Tlock contains sync.Once contains sync.Mutex"
68 *tp, // want `literal copies lock value from \*tp: a.Tlock contains sync.Once contains sync.Mutex`
71 // override 'new' keyword
72 new := func(interface{}) {}
73 new(t) // want "call of new copies lock value: a.Tlock contains sync.Once contains sync.Mutex"
75 // copy of array of locks
77 muB := muA // want "assignment copies lock value to muB: sync.Mutex"
78 muA = muB // want "assignment copies lock value to muA: sync.Mutex"
79 muSlice := muA[:] // OK
81 // multidimensional array
82 var mmuA [5][5]sync.Mutex
83 mmuB := mmuA // want "assignment copies lock value to mmuB: sync.Mutex"
84 mmuA = mmuB // want "assignment copies lock value to mmuA: sync.Mutex"
85 mmuSlice := mmuA[:] // OK
88 var fmuA [5][][5]sync.Mutex
91 fmuSlice := fmuA[:] // OK
94 func LenAndCapOnLockArrays() {
99 // override 'len' and 'cap' keywords
101 len := func(interface{}) {}
102 len(a) // want "call of len copies lock value: sync.Mutex"
104 cap := func(interface{}) {}
105 cap(a) // want "call of cap copies lock value: sync.Mutex"
110 unsafe.Sizeof(mu) // OK
111 unsafe1.Sizeof(mu) // OK
113 unsafe := struct{ Sizeof func(interface{}) }{}
114 unsafe.Sizeof(mu) // want "call of unsafe.Sizeof copies lock value: sync.Mutex"
115 Sizeof := func(interface{}) {}
116 Sizeof(mu) // want "call of Sizeof copies lock value: sync.Mutex"
119 // SyncTypesCheck checks copying of sync.* types except sync.Mutex
120 func SyncTypesCheck() {
121 // sync.RWMutex copying
122 var rwmuX sync.RWMutex
123 var rwmuXX = sync.RWMutex{}
124 rwmuX1 := new(sync.RWMutex)
125 rwmuY := rwmuX // want "assignment copies lock value to rwmuY: sync.RWMutex"
126 rwmuY = rwmuX // want "assignment copies lock value to rwmuY: sync.RWMutex"
127 var rwmuYY = rwmuX // want "variable declaration copies lock value to rwmuYY: sync.RWMutex"
129 rwmuZ := &sync.RWMutex{}
133 var condXX = sync.Cond{}
134 condX1 := new(sync.Cond)
135 condY := condX // want "assignment copies lock value to condY: sync.Cond contains sync.noCopy"
136 condY = condX // want "assignment copies lock value to condY: sync.Cond contains sync.noCopy"
137 var condYY = condX // want "variable declaration copies lock value to condYY: sync.Cond contains sync.noCopy"
142 condZ = sync.NewCond(&sync.Mutex{})
144 // sync.WaitGroup copying
145 var wgX sync.WaitGroup
146 var wgXX = sync.WaitGroup{}
147 wgX1 := new(sync.WaitGroup)
148 wgY := wgX // want "assignment copies lock value to wgY: sync.WaitGroup contains sync.noCopy"
149 wgY = wgX // want "assignment copies lock value to wgY: sync.WaitGroup contains sync.noCopy"
150 var wgYY = wgX // want "variable declaration copies lock value to wgYY: sync.WaitGroup contains sync.noCopy"
152 wgZ := &sync.WaitGroup{}
156 var poolXX = sync.Pool{}
157 poolX1 := new(sync.Pool)
158 poolY := poolX // want "assignment copies lock value to poolY: sync.Pool contains sync.noCopy"
159 poolY = poolX // want "assignment copies lock value to poolY: sync.Pool contains sync.noCopy"
160 var poolYY = poolX // want "variable declaration copies lock value to poolYY: sync.Pool contains sync.noCopy"
162 poolZ := &sync.Pool{}
166 var onceXX = sync.Once{}
167 onceX1 := new(sync.Once)
168 onceY := onceX // want "assignment copies lock value to onceY: sync.Once contains sync.Mutex"
169 onceY = onceX // want "assignment copies lock value to onceY: sync.Once contains sync.Mutex"
170 var onceYY = onceX // want "variable declaration copies lock value to onceYY: sync.Once contains sync.Mutex"
172 onceZ := &sync.Once{}
175 // AtomicTypesCheck checks copying of sync/atomic types
176 func AtomicTypesCheck() {
177 // atomic.Value copying
179 var vXX = atomic.Value{}
180 vX1 := new(atomic.Value)
181 // These are OK because the value has not been used yet.
182 // (And vet can't tell whether it has been used, so they're always OK.)
187 vZ := &atomic.Value{}