github.com/karrick/go@v0.0.0-20170817181416-d5b0ec858b37/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 "call of new copies lock value: testdata.Tlock contains sync.Once contains sync.Mutex" 71 72 // copy of array of locks 73 var muA [5]sync.Mutex 74 muB := muA // ERROR "assignment copies lock value to muB: sync.Mutex" 75 muA = muB // ERROR "assignment copies lock value to muA: sync.Mutex" 76 muSlice := muA[:] // OK 77 78 // multidimensional array 79 var mmuA [5][5]sync.Mutex 80 mmuB := mmuA // ERROR "assignment copies lock value to mmuB: sync.Mutex" 81 mmuA = mmuB // ERROR "assignment copies lock value to mmuA: sync.Mutex" 82 mmuSlice := mmuA[:] // OK 83 84 // slice copy is ok 85 var fmuA [5][][5]sync.Mutex 86 fmuB := fmuA // OK 87 fmuA = fmuB // OK 88 fmuSlice := fmuA[:] // OK 89 } 90 91 func LenAndCapOnLockArrays() { 92 var a [5]sync.Mutex 93 aLen := len(a) // OK 94 aCap := cap(a) // OK 95 96 // override 'len' and 'cap' keywords 97 98 len := func(interface{}) {} 99 len(a) // ERROR "call of len copies lock value: sync.Mutex" 100 101 cap := func(interface{}) {} 102 cap(a) // ERROR "call of cap copies lock value: sync.Mutex" 103 } 104 105 // SyncTypesCheck checks copying of sync.* types except sync.Mutex 106 func SyncTypesCheck() { 107 // sync.RWMutex copying 108 var rwmuX sync.RWMutex 109 var rwmuXX = sync.RWMutex{} 110 rwmuX1 := new(sync.RWMutex) 111 rwmuY := rwmuX // ERROR "assignment copies lock value to rwmuY: sync.RWMutex" 112 rwmuY = rwmuX // ERROR "assignment copies lock value to rwmuY: sync.RWMutex" 113 var rwmuYY = rwmuX // ERROR "variable declaration copies lock value to rwmuYY: sync.RWMutex" 114 rwmuP := &rwmuX 115 rwmuZ := &sync.RWMutex{} 116 117 // sync.Cond copying 118 var condX sync.Cond 119 var condXX = sync.Cond{} 120 condX1 := new(sync.Cond) 121 condY := condX // ERROR "assignment copies lock value to condY: sync.Cond contains sync.noCopy" 122 condY = condX // ERROR "assignment copies lock value to condY: sync.Cond contains sync.noCopy" 123 var condYY = condX // ERROR "variable declaration copies lock value to condYY: sync.Cond contains sync.noCopy" 124 condP := &condX 125 condZ := &sync.Cond{ 126 L: &sync.Mutex{}, 127 } 128 condZ = sync.NewCond(&sync.Mutex{}) 129 130 // sync.WaitGroup copying 131 var wgX sync.WaitGroup 132 var wgXX = sync.WaitGroup{} 133 wgX1 := new(sync.WaitGroup) 134 wgY := wgX // ERROR "assignment copies lock value to wgY: sync.WaitGroup contains sync.noCopy" 135 wgY = wgX // ERROR "assignment copies lock value to wgY: sync.WaitGroup contains sync.noCopy" 136 var wgYY = wgX // ERROR "variable declaration copies lock value to wgYY: sync.WaitGroup contains sync.noCopy" 137 wgP := &wgX 138 wgZ := &sync.WaitGroup{} 139 140 // sync.Pool copying 141 var poolX sync.Pool 142 var poolXX = sync.Pool{} 143 poolX1 := new(sync.Pool) 144 poolY := poolX // ERROR "assignment copies lock value to poolY: sync.Pool contains sync.noCopy" 145 poolY = poolX // ERROR "assignment copies lock value to poolY: sync.Pool contains sync.noCopy" 146 var poolYY = poolX // ERROR "variable declaration copies lock value to poolYY: sync.Pool contains sync.noCopy" 147 poolP := &poolX 148 poolZ := &sync.Pool{} 149 150 // sync.Once copying 151 var onceX sync.Once 152 var onceXX = sync.Once{} 153 onceX1 := new(sync.Once) 154 onceY := onceX // ERROR "assignment copies lock value to onceY: sync.Once contains sync.Mutex" 155 onceY = onceX // ERROR "assignment copies lock value to onceY: sync.Once contains sync.Mutex" 156 var onceYY = onceX // ERROR "variable declaration copies lock value to onceYY: sync.Once contains sync.Mutex" 157 onceP := &onceX 158 onceZ := &sync.Once{} 159 } 160 161 // AtomicTypesCheck checks copying of sync/atomic types 162 func AtomicTypesCheck() { 163 // atomic.Value copying 164 var vX atomic.Value 165 var vXX = atomic.Value{} 166 vX1 := new(atomic.Value) 167 vY := vX // ERROR "assignment copies lock value to vY: sync/atomic.Value contains sync/atomic.noCopy" 168 vY = vX // ERROR "assignment copies lock value to vY: sync/atomic.Value contains sync/atomic.noCopy" 169 var vYY = vX // ERROR "variable declaration copies lock value to vYY: sync/atomic.Value contains sync/atomic.noCopy" 170 vP := &vX 171 vZ := &atomic.Value{} 172 }