| package a |
| |
| import "sync" |
| |
| // These examples are taken from golang/go#61678, modified so that A and B |
| // contain a mutex. |
| |
| type A struct { |
| a A |
| mu sync.Mutex |
| } |
| |
| type B struct { |
| a A |
| b B |
| mu sync.Mutex |
| } |
| |
| func okay(x A) {} |
| func sure() { var x A; nop(x) } |
| |
| var fine B |
| |
| func what(x B) {} // want `passes lock by value` |
| func bad() { var x B; nop(x) } // want `copies lock value` |
| func good() { nop(B{}) } |
| func stillgood() { nop(B{b: B{b: B{b: B{}}}}) } |
| func nope() { nop(B{}.b) } // want `copies lock value` |
| |
| func nop(any) {} // only used to get around unused variable errors |