1
0
mirror of https://github.com/golang/go synced 2024-11-25 06:07:58 -07:00

vet: fix rangeloop.

In a range loop, the presence of a value implies the presence of a key.
However, the presence of a value as an *ast.Ident does not imply that
the key is also an *ast.Ident, thus leading to a panic any time the
two argument form is used where the key is not an identifier.

R=golang-dev, adg, r
CC=golang-dev
https://golang.org/cl/6540045
This commit is contained in:
David Symonds 2012-09-20 08:12:47 +10:00
parent adcf0a2aa0
commit 5a93fea08e

View File

@ -53,8 +53,12 @@ func checkRangeLoop(f *File, n *ast.RangeStmt) {
return return
} }
ast.Inspect(lit.Body, func(n ast.Node) bool { ast.Inspect(lit.Body, func(n ast.Node) bool {
if n, ok := n.(*ast.Ident); ok && n.Obj != nil && (n.Obj == key.Obj || n.Obj == val.Obj) { id, ok := n.(*ast.Ident)
f.Warn(n.Pos(), "range variable", n.Name, "enclosed by function") if !ok || id.Obj == nil {
return true
}
if key != nil && id.Obj == key.Obj || val != nil && id.Obj == val.Obj {
f.Warn(id.Pos(), "range variable", id.Name, "enclosed by function")
} }
return true return true
}) })
@ -101,4 +105,13 @@ func BadRangeLoopsUsedInTests() {
println(i, v) println(i, v)
}() }()
} }
// If the key of the range statement is not an identifier
// the code should not panic (it used to).
var x [2]int
var f int
for x[0], f = range s {
go func() {
_ = f // ERROR "range variable f enclosed by function"
}()
}
} }