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)
75 panic("must not be executed")
79 // test range over functions
83 func yield4x(yield func() bool) {
84 _ = yield() && yield() && yield() && yield()
87 func yield4(yield func(int) bool) {
88 _ = yield(1) && yield(2) && yield(3) && yield(4)
91 func yield3(yield func(int) bool) {
92 _ = yield(1) && yield(2) && yield(3)
95 func yield2(yield func(int) bool) {
96 _ = yield(1) && yield(2)
105 println("wrong count ranging over yield4x:", j)
110 for _ = range yield4 {
114 println("wrong count ranging over yield4:", j)
122 for i := range yield4 {
124 println("range var", i, "want", j)
130 println("wrong count ranging over f:", j)
142 for i = range yield4 {
144 println("range var", i, "want", j)
150 println("wrong count ranging over f:", j)
154 println("wrong final i ranging over f:", i)
166 for i = range yield4 {
168 println("range var", i, "want", j)
178 println("wrong count ranging over f:", j)
182 println("wrong final i ranging over f:", i)
195 for i = range yield4 {
197 println("range var", i, "want", j)
207 println("wrong count ranging over f:", j)
211 println("wrong final i ranging over f:", i)
219 func func5() (int, int) {
220 for i := range yield4 {
228 if x != 10 || y != 1 {
229 println("wrong results", x, y, "want", 10, 1)
234 func func6() (z, w int) {
235 for i := range yield4 {
245 if x != 10 || y != 1 {
246 println("wrong results", x, y, "want", 10, 1)
254 saved = append(saved, x)
257 func printslice(s []int) {
259 for i, x := range s {
268 func eqslice(s, t []int) bool {
269 if len(s) != len(t) {
272 for i, x := range s {
282 for i := range yield4 {
288 func checkslice(name string, saved, want []int) {
289 if !eqslice(saved, want) {
290 print("wrong results ")
302 want := []int{5, 4, 3, 2, 1, -1}
303 checkslice("testfunc7", saved, want)
308 for i := range yield2 {
309 for j := range yield3 {
315 for i := range yield4 {
324 want := []int{-3, 4, 3, 2, 1, -2, 2, 23, 22, 21, 1, 13, 12, 11, -1}
325 checkslice("testfunc8", saved, want)
330 for _ = range yield2 {
331 for _ = range yield3 {
341 want := []int{6, 5, 4, 3, 2, 1}
342 checkslice("testfunc9", saved, want)
345 // test that range evaluates the index and value expressions
346 // exactly once per iteration.
350 func getvar(p *int) *int {
355 func iter2(list ...int) func(func(int, int) bool) {
356 return func(yield func(int, int) bool) {
357 for i, x := range list {
370 for *getvar(&i), *getvar(&v) = range iter2(1, 2) {
375 println("wrong number of calls:", ncalls, "!= 4")
378 if si != 1 || sv != 3 {
379 println("wrong sum in testcalls", si, sv)