|
1 | 1 | package testdata
|
2 | 2 |
|
3 |
| -import "sync" |
| 3 | +import ( |
| 4 | + "sync" |
| 5 | + "sync/atomic" |
| 6 | +) |
4 | 7 |
|
5 | 8 | func OkFunc() {
|
6 | 9 | var x *sync.Mutex
|
@@ -66,3 +69,72 @@ func BadFunc() {
|
66 | 69 | new := func(interface{}) {}
|
67 | 70 | new(t) // ERROR "function call copies lock value: testdata.Tlock contains sync.Once contains sync.Mutex"
|
68 | 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 | +} |
0 commit comments