mirror of
https://github.com/golang/go
synced 2024-11-21 20:04: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
|
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"
|
||||||
|
}()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user