mirror of
https://github.com/golang/go
synced 2024-11-21 14:24:44 -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:
parent
adcf0a2aa0
commit
5a93fea08e
@ -53,8 +53,12 @@ func checkRangeLoop(f *File, n *ast.RangeStmt) {
|
||||
return
|
||||
}
|
||||
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) {
|
||||
f.Warn(n.Pos(), "range variable", n.Name, "enclosed by function")
|
||||
id, ok := n.(*ast.Ident)
|
||||
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
|
||||
})
|
||||
@ -101,4 +105,13 @@ func BadRangeLoopsUsedInTests() {
|
||||
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"
|
||||
}()
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user