--- /dev/null
+// $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG: tuple evaluation order
+
+// Copyright 2010 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.
+
+// Test order of evaluation in tuple assignments.
+
+package main
+
+var i byte = 0
+var a [30]byte
+func f() *byte {
+ i++
+ return &a[i-1]
+}
+func gbyte() byte {
+ i++
+ return 'a' + i - 1
+}
+func gint() byte {
+ i++
+ return i - 1
+}
+func x() (byte, byte) {
+ i++
+ return 'a' + i - 1, 'a' + i - 1
+}
+func e1(c chan byte, expected byte) chan byte {
+ if i != expected {
+ panicln("e1: got", i, "expected", expected)
+ }
+ i++
+ return c
+}
+
+type Empty interface {}
+type I interface {
+ Get() byte
+}
+type S1 struct {
+ i byte
+}
+func (p S1) Get() byte {
+ return p.i
+}
+type S2 struct {
+ i byte
+}
+func e2(p Empty, expected byte) Empty {
+ if i != expected {
+ panicln("e2: got", i, "expected", expected)
+ }
+ i++
+ return p
+}
+func e3(p *I, expected byte) *I {
+ if i != expected {
+ panicln("e3: got", i, "expected", expected)
+ }
+ i++
+ return p
+}
+
+func main() {
+ for i := range a {
+ a[i] = ' '
+ }
+
+ *f(), *f(), *f() = gbyte(), gbyte(), gbyte()
+
+ *f(), *f() = x()
+
+ m := make(map[byte]byte)
+ m[10] = 'A'
+ var p1, p2 bool
+ *f(), p1 = m[gint()]
+ *f(), p2 = m[gint()]
+ if !p1 || p2 {
+ panicln("bad map check", i, p1, p2)
+ }
+
+ m[13] = 'B'
+ m[gint()] = gbyte(), false
+ if _, present := m[13]; present {
+ panicln("bad map removal")
+ }
+
+ c := make(chan byte, 1)
+ c <- 'C'
+ *f(), p1 = <-e1(c, 16)
+ *f(), p2 = <-e1(c, 18)
+ if !p1 || p2 {
+ panicln("bad chan check", i, p1, p2)
+ }
+
+ s1 := S1{'D'}
+ s2 := S2{'E'}
+ var iv I
+ *e3(&iv, 19), p1 = e2(s1, 20).(I)
+ *e3(&iv, 21), p2 = e2(s2, 22).(I)
+ if !p1 || p2 {
+ panicln("bad interface check", i, p1, p2)
+ }
+
+ s := string(a[0:i])
+ if s != "def ii A C " {
+ panicln("bad array results:", s)
+ }
+}