diff options
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" + }() + } } |
