From 5a93fea08e7c9cbc4ed5ab7ba161b3e078497fb3 Mon Sep 17 00:00:00 2001 From: David Symonds Date: Thu, 20 Sep 2012 08:12:47 +1000 Subject: [PATCH] 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 --- src/cmd/vet/rangeloop.go | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/cmd/vet/rangeloop.go b/src/cmd/vet/rangeloop.go index 2fdb0b6216..71cbc11579 100644 --- a/src/cmd/vet/rangeloop.go +++ b/src/cmd/vet/rangeloop.go @@ -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" + }() + } }