| // 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") | |
| } | |
| } |