--- /dev/null
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// Copyright 2009 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.
+
+package main
+
+var counter uint
+var shift uint
+
+func GetValue() uint {
+ counter++;
+ return 1 << shift
+}
+
+func Send(a, b *chan uint) int {
+ var i int;
+ LOOP:
+ for {
+ select {
+ case a <- GetValue():
+ i++;
+ a = nil;
+ case b <- GetValue():
+ i++;
+ b = nil;
+ default:
+ break LOOP;
+ }
+ shift++;
+ }
+ return i;
+}
+
+func main() {
+ a := new(chan uint, 1);
+ b := new(chan uint, 1);
+ if v := Send(a, b); v != 2 {
+ panicln("Send returned", v, "!= 2");
+ }
+ if av, bv := <- a, <- b; av | bv != 3 {
+ panicln("bad values", av, bv);
+ }
+ if v := Send(a, nil); v != 1 {
+ panicln("Send returned", v, "!= 1");
+ }
+ if counter != 10 {
+ panicln("counter is", counter, "!= 10");
+ }
+}