}
for _, x := range ce.Args {
if path := lockPathRhs(f, x); path != nil {
- f.Badf(x.Pos(), "function call copies lock value: %v", path)
+ f.Badf(x.Pos(), "call of %s copies lock value: %v", f.gofmt(ce.Fun), path)
}
}
}
// override 'new' keyword
new := func(interface{}) {}
- new(t) // ERROR "function call copies lock value: testdata.Tlock contains sync.Once contains sync.Mutex"
+ new(t) // ERROR "call of new copies lock value: testdata.Tlock contains sync.Once contains sync.Mutex"
// copy of array of locks
var muA [5]sync.Mutex
// override 'len' and 'cap' keywords
len := func(interface{}) {}
- len(a) // ERROR "function call copies lock value: sync.Mutex"
+ len(a) // ERROR "call of len copies lock value: sync.Mutex"
cap := func(interface{}) {}
- cap(a) // ERROR "function call copies lock value: sync.Mutex"
+ cap(a) // ERROR "call of cap copies lock value: sync.Mutex"
}
// SyncTypesCheck checks copying of sync.* types except sync.Mutex
f(1, "foo")
f(2, &t)
f(3, &sync.Mutex{})
- f(4, m) // ERROR "function call copies lock value: sync.Mutex"
- f(5, t) // ERROR "function call copies lock value: struct{lock sync.Mutex} contains sync.Mutex"
+ f(4, m) // ERROR "call of f copies lock value: sync.Mutex"
+ f(5, t) // ERROR "call of f copies lock value: struct{lock sync.Mutex} contains sync.Mutex"
+ var fntab []func(t)
+ fntab[0](t) // ERROR "call of fntab.0. copies lock value: struct{lock sync.Mutex} contains sync.Mutex"
}
// Returning lock via interface value