// run // 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 { println("e1: got", i, "expected", expected) panic("fail") } 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 { println("e2: got", i, "expected", expected) panic("fail") } i++ return p } func e3(p *I, expected byte) *I { if i != expected { println("e3: got", i, "expected", expected) panic("fail") } i++ return p } func main() { for i := range a { a[i] = ' ' } // 0 1 2 3 4 5 *f(), *f(), *f() = gbyte(), gbyte(), gbyte() // 6 7 8 *f(), *f() = x() m := make(map[byte]byte) m[10] = 'A' var p1, p2 bool // 9 10 *f(), p1 = m[gint()] // 11 12 *f(), p2 = m[gint()] a[11] += '0' if !p1 || p2 { println("bad map check", i, p1, p2) panic("fail") } m[13] = 'B' // 13 14 delete(m, gint()) gbyte() if _, present := m[13]; present { println("bad map removal") panic("fail") } c := make(chan byte, 1) c <- 'C' // 15 16 *f(), p1 = <-e1(c, 16) close(c) // 17 18 *f(), p2 = <-e1(c, 18) a[17] += '0' if !p1 || p2 { println("bad chan check", i, p1, p2) panic("fail") } s1 := S1{'D'} s2 := S2{'E'} var iv I // 19 20 *e3(&iv, 19), p1 = e2(s1, 20).(I) // 21 22 *e3(&iv, 21), p2 = e2(s2, 22).(I) if !p1 || p2 { println("bad interface check", i, p1, p2) panic("fail") } s := string(a[0:i]) if s != "def ii A 0 C 0 " { println("bad array results:", s) panic("fail") } }