1 // $G $D/$F.go && $L $F.$A && ./$A.out
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.
9 // test range over channels
11 func gen(c chan int, lo, hi int) {
12 for i := lo; i <= hi; i++ {
18 func seq(lo, hi int) chan int {
26 for i := range seq('a', 'z') {
29 if s != "abcdefghijklmnopqrstuvwxyz" {
30 println("Wanted lowercase alphabet; got", s)
35 // test that range over slice only evaluates
36 // the expression after "range" once.
40 func makeslice() []int {
42 return []int{1, 2, 3, 4, 5}
48 for _, v := range makeslice() {
52 println("range called makeslice", nmake, "times")
56 println("wrong sum ranging over makeslice")
64 for i := range makeslice() {
68 println("range called makeslice", nmake, "times")
72 println("wrong sum ranging over makeslice")
77 // test that range over array only evaluates
78 // the expression after "range" once.
80 func makearray() [5]int {
82 return [5]int{1, 2, 3, 4, 5}
88 for _, v := range makearray() {
92 println("range called makearray", nmake, "times")
96 println("wrong sum ranging over makearray")
104 for i := range makearray() {
108 println("range called makearray", nmake, "times")
112 println("wrong sum ranging over makearray")
117 func makearrayptr() *[5]int {
119 return &[5]int{1, 2, 3, 4, 5}
122 func testarrayptr() {
124 x := len(makearrayptr())
125 if x != 5 || nmake != 1 {
126 println("len called makearrayptr", nmake, "times and got len", x)
130 x = cap(makearrayptr())
131 if x != 5 || nmake != 1 {
132 println("cap called makearrayptr", nmake, "times and got len", x)
137 for _, v := range makearrayptr() {
141 println("range called makearrayptr", nmake, "times")
145 println("wrong sum ranging over makearrayptr")
150 func testarrayptr1() {
153 for i := range makearrayptr() {
157 println("range called makearrayptr", nmake, "times")
161 println("wrong sum ranging over makearrayptr")
166 // test that range over string only evaluates
167 // the expression after "range" once.
169 func makestring() string {
177 for _, v := range makestring() {
181 println("range called makestring", nmake, "times")
184 if s != 'a'+'b'+'c'+'d'+'☺' {
185 println("wrong sum ranging over makestring")
193 for i := range makestring() {
197 println("range called makestring", nmake, "times")
201 println("wrong sum ranging over makestring")
206 // test that range over map only evaluates
207 // the expression after "range" once.
209 func makemap() map[int]int {
211 return map[int]int{0:'a', 1:'b', 2:'c', 3:'d', 4:'☺'}
217 for _, v := range makemap() {
221 println("range called makemap", nmake, "times")
224 if s != 'a'+'b'+'c'+'d'+'☺' {
225 println("wrong sum ranging over makemap")
233 for i := range makemap() {
237 println("range called makemap", nmake, "times")
241 println("wrong sum ranging over makemap")
246 // test that range evaluates the index and value expressions
247 // exactly once per iteration.
251 func getvar(p *int) *int {
260 for *getvar(&i), *getvar(&v) = range [2]int{1, 2} {
265 println("wrong number of calls:", ncalls, "!= 4")
268 if si != 1 || sv != 3 {
269 println("wrong sum in testcalls", si, sv)
274 for *getvar(&i), *getvar(&v) = range [0]int{} {
275 println("loop ran on empty array")
279 println("wrong number of calls:", ncalls, "!= 0")