]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/vet: don't treat fields like variables in rangeloop check
authorDominik Honnef <dominik@honnef.co>
Sat, 26 Mar 2016 13:23:56 +0000 (14:23 +0100)
committerRob Pike <r@golang.org>
Sun, 27 Mar 2016 05:31:54 +0000 (05:31 +0000)
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>
src/cmd/vet/rangeloop.go
src/cmd/vet/testdata/rangeloop.go

index 11eef59d90cd043071cf710ea8d16161c51880ab..e085e21a23e060449552ed71ef665e4d0d86c861 100644 (file)
@@ -62,6 +62,10 @@ func checkRangeLoop(f *File, node ast.Node) {
                if !ok || id.Obj == nil {
                        return true
                }
+               if f.pkg.types[id].Type == nil {
+                       // Not referring to a variable
+                       return true
+               }
                if key != nil && id.Obj == key.Obj || val != nil && id.Obj == val.Obj {
                        f.Bad(id.Pos(), "range variable", id.Name, "captured by func literal")
                }
index 37b5940ddd2137e94259d7736c0df52ab6c4e070..66223aad7170b8944e2fd1628b4c88deef509f5b 100644 (file)
@@ -56,4 +56,13 @@ func RangeLoopTests() {
                        _ = f // ERROR "range variable f captured by func literal"
                }()
        }
+       type T struct {
+               v int
+       }
+       for _, v := range s {
+               go func() {
+                       _ = T{v: 1}
+                       _ = []int{v: 1} // ERROR "range variable v captured by func literal"
+               }()
+       }
 }