From 4ffa5eb8764b9c811bff329e7d2e392dc1e8972c Mon Sep 17 00:00:00 2001 From: Dominik Honnef Date: Sat, 26 Mar 2016 14:23:56 +0100 Subject: [PATCH] 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 TryBot-Result: Gobot Gobot Reviewed-by: Rob Pike --- src/cmd/vet/rangeloop.go | 4 ++++ src/cmd/vet/testdata/rangeloop.go | 9 +++++++++ 2 files changed, 13 insertions(+) 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" + }() + } } -- 2.48.1