aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDominik Honnef <dominik@honnef.co>2016-03-26 14:23:56 +0100
committerRob Pike <r@golang.org>2016-03-27 05:31:54 +0000
commit4ffa5eb8764b9c811bff329e7d2e392dc1e8972c (patch)
tree70e18e5f75de20124d8e3e37b3583d9873335f39 /src
parentd170d3edd77aa571e65ff51ff382b90e9b00f40b (diff)
downloadgo-4ffa5eb8764b9c811bff329e7d2e392dc1e8972c.tar.xz
cmd/vet: don't treat fields like variables in rangeloop check
Fixes #13236 Change-Id: If902ac66718e0a0790fab9835921ce4ef980965b Reviewed-on: https://go-review.googlesource.com/21183 Run-TryBot: Rob Pike <r@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rob Pike <r@golang.org>
Diffstat (limited to 'src')
-rw-r--r--src/cmd/vet/rangeloop.go4
-rw-r--r--src/cmd/vet/testdata/rangeloop.go9
2 files changed, 13 insertions, 0 deletions
diff --git a/src/cmd/vet/rangeloop.go b/src/cmd/vet/rangeloop.go
index 11eef59d90..e085e21a23 100644
--- a/src/cmd/vet/rangeloop.go
+++ b/src/cmd/vet/rangeloop.go
@@ -62,6 +62,10 @@ func checkRangeLoop(f *File, node ast.Node) {
if !ok || id.Obj == nil {
return true
}
+ if f.pkg.types[id].Type == nil {
+ // Not referring to a variable
+ return true
+ }
if key != nil && id.Obj == key.Obj || val != nil && id.Obj == val.Obj {
f.Bad(id.Pos(), "range variable", id.Name, "captured by func literal")
}
diff --git a/src/cmd/vet/testdata/rangeloop.go b/src/cmd/vet/testdata/rangeloop.go
index 37b5940ddd..66223aad71 100644
--- a/src/cmd/vet/testdata/rangeloop.go
+++ b/src/cmd/vet/testdata/rangeloop.go
@@ -56,4 +56,13 @@ func RangeLoopTests() {
_ = f // ERROR "range variable f captured by func literal"
}()
}
+ type T struct {
+ v int
+ }
+ for _, v := range s {
+ go func() {
+ _ = T{v: 1}
+ _ = []int{v: 1} // ERROR "range variable v captured by func literal"
+ }()
+ }
}