| // 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" |
| }() |
| } |
| } |