aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cmd/vet/rangeloop.go4
-rw-r--r--src/cmd/vet/testdata/rangeloop.go9
2 files changed, 13 insertions, 0 deletions
diff --git a/src/cmd/vet/rangeloop.go b/src/cmd/vet/rangeloop.go
index 11eef59d90..e085e21a23 100644
--- a/src/cmd/vet/rangeloop.go
+++ b/src/cmd/vet/rangeloop.go
@@ -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")
}
diff --git a/src/cmd/vet/testdata/rangeloop.go b/src/cmd/vet/testdata/rangeloop.go
index 37b5940ddd..66223aad71 100644
--- a/src/cmd/vet/testdata/rangeloop.go
+++ b/src/cmd/vet/testdata/rangeloop.go
@@ -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"
+ }()
+ }
}