Skip to content

Commit 4ffa5eb

Browse files
dominikhrobpike
authored andcommitted
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>
1 parent d170d3e commit 4ffa5eb

File tree

2 files changed

+13
-0
lines changed

2 files changed

+13
-0
lines changed

src/cmd/vet/rangeloop.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ func checkRangeLoop(f *File, node ast.Node) {
6262
if !ok || id.Obj == nil {
6363
return true
6464
}
65+
if f.pkg.types[id].Type == nil {
66+
// Not referring to a variable
67+
return true
68+
}
6569
if key != nil && id.Obj == key.Obj || val != nil && id.Obj == val.Obj {
6670
f.Bad(id.Pos(), "range variable", id.Name, "captured by func literal")
6771
}

src/cmd/vet/testdata/rangeloop.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,13 @@ func RangeLoopTests() {
5656
_ = f // ERROR "range variable f captured by func literal"
5757
}()
5858
}
59+
type T struct {
60+
v int
61+
}
62+
for _, v := range s {
63+
go func() {
64+
_ = T{v: 1}
65+
_ = []int{v: 1} // ERROR "range variable v captured by func literal"
66+
}()
67+
}
5968
}

0 commit comments

Comments
 (0)