| // $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] = ' ' |
| } |
| |
| // 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 { |
| panicln("bad map check", i, p1, p2) |
| } |
| |
| m[13] = 'B' |
| // 13 14 |
| m[gint()] = gbyte(), false |
| if _, present := m[13]; present { |
| panicln("bad map removal") |
| } |
| |
| c := make(chan byte, 1) |
| c <- 'C' |
| // 15 16 |
| *f(), p1 = <-e1(c, 16) |
| // 17 18 |
| *f(), p2 = <-e1(c, 18) |
| a[17] += '0' |
| if !p1 || p2 { |
| panicln("bad chan check", i, p1, p2) |
| } |
| |
| 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 { |
| panicln("bad interface check", i, p1, p2) |
| } |
| |
| s := string(a[0:i]) |
| if s != "def ii A 0 C 0 " { |
| panicln("bad array results:", s) |
| } |
| } |