1 // run -goexperiment range
3 // Copyright 2009 The Go Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file.
7 // Test the 'for range' construct.
11 // test range over integers
16 for i := range int(4) {
18 println("range var", i, "want", j)
24 println("wrong count ranging over 4:", j)
37 println("range var", i, "want", j)
43 println("wrong count ranging over 4:", j)
55 for i := range MyInt(4) {
57 println("range var", i, "want", j)
63 println("wrong count ranging over 4:", j)
71 // test range over functions
75 func yield4x(yield func() bool) {
76 _ = yield() && yield() && yield() && yield()
79 func yield4(yield func(int) bool) {
80 _ = yield(1) && yield(2) && yield(3) && yield(4)
83 func yield3(yield func(int) bool) {
84 _ = yield(1) && yield(2) && yield(3)
87 func yield2(yield func(int) bool) {
88 _ = yield(1) && yield(2)
97 println("wrong count ranging over yield4x:", j)
102 for _ = range yield4 {
106 println("wrong count ranging over yield4:", j)
114 for i := range yield4 {
116 println("range var", i, "want", j)
122 println("wrong count ranging over f:", j)
134 for i = range yield4 {
136 println("range var", i, "want", j)
142 println("wrong count ranging over f:", j)
146 println("wrong final i ranging over f:", i)
158 for i = range yield4 {
160 println("range var", i, "want", j)
170 println("wrong count ranging over f:", j)
174 println("wrong final i ranging over f:", i)
187 for i = range yield4 {
189 println("range var", i, "want", j)
199 println("wrong count ranging over f:", j)
203 println("wrong final i ranging over f:", i)
211 func func5() (int, int) {
212 for i := range yield4 {
220 if x != 10 || y != 1 {
221 println("wrong results", x, y, "want", 10, 1)
226 func func6() (z, w int) {
227 for i := range yield4 {
237 if x != 10 || y != 1 {
238 println("wrong results", x, y, "want", 10, 1)
246 saved = append(saved, x)
249 func printslice(s []int) {
251 for i, x := range s {
260 func eqslice(s, t []int) bool {
261 if len(s) != len(t) {
264 for i, x := range s {
274 for i := range yield4 {
280 func checkslice(name string, saved, want []int) {
281 if !eqslice(saved, want) {
282 print("wrong results ")
294 want := []int{5, 4, 3, 2, 1, -1}
295 checkslice("testfunc7", saved, want)
300 for i := range yield2 {
301 for j := range yield3 {
307 for i := range yield4 {
316 want := []int{-3, 4, 3, 2, 1, -2, 2, 23, 22, 21, 1, 13, 12, 11, -1}
317 checkslice("testfunc8", saved, want)
322 for _ = range yield2 {
323 for _ = range yield3 {
333 want := []int{6, 5, 4, 3, 2, 1}
334 checkslice("testfunc9", saved, want)
337 // test that range evaluates the index and value expressions
338 // exactly once per iteration.
342 func getvar(p *int) *int {
347 func iter2(list ...int) func(func(int, int) bool) {
348 return func(yield func(int, int) bool) {
349 for i, x := range list {
362 for *getvar(&i), *getvar(&v) = range iter2(1, 2) {
367 println("wrong number of calls:", ncalls, "!= 4")
370 if si != 1 || sv != 3 {
371 println("wrong sum in testcalls", si, sv)