aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Pike <r@golang.org>2016-12-25 08:51:21 +1100
committerRob Pike <r@golang.org>2017-01-03 19:23:23 +0000
commitd698e614a21cd50055c7c5e7100069d2bcdb9b83 (patch)
tree1855b664f2295e194a7ba28140d333eebe1e8be2
parent161cd34f788ee9c6b61565eb6f865434bc135306 (diff)
downloadgo-d698e614a21cd50055c7c5e7100069d2bcdb9b83.tar.gz
go-d698e614a21cd50055c7c5e7100069d2bcdb9b83.zip
cmd/vet: include function name or value in copylock message
Given var t struct{ lock sync.Mutex } var fntab []func(t) f(a(), b(&t), c(), fntab[0](t)) Before: function call copies lock value: struct{lock sync.Mutex} contains sync.Mutex After: call of fntab[0] copies lock value: struct{lock sync.Mutex} contains sync.Mutex This will make diagnosis easier when there are multiple function calls per line. Change-Id: I9881713c5671b847b84a0df0115f57e7cba17d72 Reviewed-on: https://go-review.googlesource.com/34730 Reviewed-by: Ian Lance Taylor <iant@golang.org>
-rw-r--r--src/cmd/vet/copylock.go2
-rw-r--r--src/cmd/vet/testdata/copylock.go6
-rw-r--r--src/cmd/vet/testdata/copylock_func.go6
3 files changed, 8 insertions, 6 deletions
diff --git a/src/cmd/vet/copylock.go b/src/cmd/vet/copylock.go
index f3ab8e2e05..27eb5d4651 100644
--- a/src/cmd/vet/copylock.go
+++ b/src/cmd/vet/copylock.go
@@ -101,7 +101,7 @@ func checkCopyLocksCallExpr(f *File, ce *ast.CallExpr) {
}
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)
}
}
}
diff --git a/src/cmd/vet/testdata/copylock.go b/src/cmd/vet/testdata/copylock.go
index 3ce06f88d4..6fabbc337a 100644
--- a/src/cmd/vet/testdata/copylock.go
+++ b/src/cmd/vet/testdata/copylock.go
@@ -67,7 +67,7 @@ func BadFunc() {
// 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
@@ -96,10 +96,10 @@ func LenAndCapOnLockArrays() {
// 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
diff --git a/src/cmd/vet/testdata/copylock_func.go b/src/cmd/vet/testdata/copylock_func.go
index bfafa124fa..d51ff27cda 100644
--- a/src/cmd/vet/testdata/copylock_func.go
+++ b/src/cmd/vet/testdata/copylock_func.go
@@ -86,8 +86,10 @@ func FuncCallInterfaceArg(f func(a int, b interface{})) {
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