--- /dev/null
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file contains tests for the loopclosure checker.
+
+package testdata
+
+func _() {
+ var s []int
+ for i, v := range s {
+ go func() {
+ println(i) // want "loop variable i captured by func literal"
+ println(v) // want "loop variable v captured by func literal"
+ }()
+ }
+ for i, v := range s {
+ defer func() {
+ println(i) // want "loop variable i captured by func literal"
+ println(v) // want "loop variable v captured by func literal"
+ }()
+ }
+ for i := range s {
+ go func() {
+ println(i) // want "loop variable i captured by func literal"
+ }()
+ }
+ for _, v := range s {
+ go func() {
+ println(v) // want "loop variable v captured by func literal"
+ }()
+ }
+ for i, v := range s {
+ go func() {
+ println(i, v)
+ }()
+ println("unfortunately, we don't catch the error above because of this statement")
+ }
+ for i, v := range s {
+ go func(i, v int) {
+ println(i, v)
+ }(i, v)
+ }
+ for i, v := range s {
+ i, v := i, v
+ go func() {
+ 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 // want "loop variable f captured by func literal"
+ }()
+ }
+ type T struct {
+ v int
+ }
+ for _, v := range s {
+ go func() {
+ _ = T{v: 1}
+ _ = map[int]int{v: 1} // want "loop variable v captured by func literal"
+ }()
+ }
+
+ // ordinary for-loops
+ for i := 0; i < 10; i++ {
+ go func() {
+ print(i) // want "loop variable i captured by func literal"
+ }()
+ }
+ for i, j := 0, 1; i < 100; i, j = j, i+j {
+ go func() {
+ print(j) // want "loop variable j captured by func literal"
+ }()
+ }
+ type cons struct {
+ car int
+ cdr *cons
+ }
+ var head *cons
+ for p := head; p != nil; p = p.cdr {
+ go func() {
+ print(p.car) // want "loop variable p captured by func literal"
+ }()
+ }
+}