diff options
| author | Dominik Honnef <dominik@honnef.co> | 2016-03-26 14:23:56 +0100 |
|---|---|---|
| committer | Rob Pike <r@golang.org> | 2016-03-27 05:31:54 +0000 |
| commit | 4ffa5eb8764b9c811bff329e7d2e392dc1e8972c (patch) | |
| tree | 70e18e5f75de20124d8e3e37b3583d9873335f39 /src | |
| parent | d170d3edd77aa571e65ff51ff382b90e9b00f40b (diff) | |
| download | go-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.go | 4 | ||||
| -rw-r--r-- | src/cmd/vet/testdata/rangeloop.go | 9 |
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" + }() + } } |
