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 }