1 // run -goexperiment rangefunc
3 // Copyright 2023 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 ranging over functions.
13 func yield4x(yield func() bool) {
14 _ = yield() && yield() && yield() && yield()
17 func yield4(yield func(int) bool) {
18 _ = yield(1) && yield(2) && yield(3) && yield(4)
21 func yield3(yield func(int) bool) {
22 _ = yield(1) && yield(2) && yield(3)
25 func yield2(yield func(int) bool) {
26 _ = yield(1) && yield(2)
35 println("wrong count ranging over yield4x:", j)
40 for _ = range yield4 {
44 println("wrong count ranging over yield4:", j)
52 for i := range yield4 {
54 println("range var", i, "want", j)
60 println("wrong count ranging over f:", j)
72 for i = range yield4 {
74 println("range var", i, "want", j)
80 println("wrong count ranging over f:", j)
84 println("wrong final i ranging over f:", i)
96 for i = range yield4 {
98 println("range var", i, "want", j)
108 println("wrong count ranging over f:", j)
112 println("wrong final i ranging over f:", i)
125 for i = range yield4 {
127 println("range var", i, "want", j)
137 println("wrong count ranging over f:", j)
141 println("wrong final i ranging over f:", i)
149 func func5() (int, int) {
150 for i := range yield4 {
158 if x != 10 || y != 1 {
159 println("wrong results", x, y, "want", 10, 1)
164 func func6() (z, w int) {
165 for i := range yield4 {
175 if x != 10 || y != 1 {
176 println("wrong results", x, y, "want", 10, 1)
184 saved = append(saved, x)
187 func printslice(s []int) {
189 for i, x := range s {
198 func eqslice(s, t []int) bool {
199 if len(s) != len(t) {
202 for i, x := range s {
212 for i := range yield4 {
218 func checkslice(name string, saved, want []int) {
219 if !eqslice(saved, want) {
220 print("wrong results ")
232 want := []int{5, 4, 3, 2, 1, -1}
233 checkslice("testfunc7", saved, want)
238 for i := range yield2 {
239 for j := range yield3 {
245 for i := range yield4 {
254 want := []int{-3, 4, 3, 2, 1, -2, 2, 23, 22, 21, 1, 13, 12, 11, -1}
255 checkslice("testfunc8", saved, want)
260 for _ = range yield2 {
261 for _ = range yield3 {
271 want := []int{6, 5, 4, 3, 2, 1}
272 checkslice("testfunc9", saved, want)
275 // test that range evaluates the index and value expressions
276 // exactly once per iteration.
280 func getvar(p *int) *int {
285 func iter2(list ...int) func(func(int, int) bool) {
286 return func(yield func(int, int) bool) {
287 for i, x := range list {
300 for *getvar(&i), *getvar(&v) = range iter2(1, 2) {
305 println("wrong number of calls:", ncalls, "!= 4")
308 if si != 1 || sv != 3 {
309 println("wrong sum in testcalls", si, sv)