Home | History | Annotate | Download | only in fixedbugs
      1 // run
      2 
      3 // Copyright 2010 The Go Authors. All rights reserved.
      4 // Use of this source code is governed by a BSD-style
      5 // license that can be found in the LICENSE file.
      6 
      7 // Test order of evaluation in tuple assignments.
      8 
      9 package main
     10 
     11 var i byte = 0
     12 var a [30]byte
     13 
     14 func f() *byte {
     15 	i++
     16 	return &a[i-1]
     17 }
     18 func gbyte() byte {
     19 	i++
     20 	return 'a' + i - 1
     21 }
     22 func gint() byte {
     23 	i++
     24 	return i - 1
     25 }
     26 func x() (byte, byte) {
     27 	i++
     28 	return 'a' + i - 1, 'a' + i - 1
     29 }
     30 func e1(c chan byte, expected byte) chan byte {
     31 	if i != expected {
     32 		println("e1: got", i, "expected", expected)
     33 		panic("fail")
     34 	}
     35 	i++
     36 	return c
     37 }
     38 
     39 type Empty interface{}
     40 type I interface {
     41 	Get() byte
     42 }
     43 type S1 struct {
     44 	i byte
     45 }
     46 
     47 func (p S1) Get() byte { return p.i }
     48 
     49 type S2 struct {
     50 	i byte
     51 }
     52 
     53 func e2(p Empty, expected byte) Empty {
     54 	if i != expected {
     55 		println("e2: got", i, "expected", expected)
     56 		panic("fail")
     57 	}
     58 	i++
     59 	return p
     60 }
     61 func e3(p *I, expected byte) *I {
     62 	if i != expected {
     63 		println("e3: got", i, "expected", expected)
     64 		panic("fail")
     65 	}
     66 	i++
     67 	return p
     68 }
     69 
     70 func main() {
     71 	for i := range a {
     72 		a[i] = ' '
     73 	}
     74 
     75 	// 0     1     2     3        4        5
     76 	*f(), *f(), *f() = gbyte(), gbyte(), gbyte()
     77 
     78 	// 6     7     8
     79 	*f(), *f() = x()
     80 
     81 	m := make(map[byte]byte)
     82 	m[10] = 'A'
     83 	var p1, p2 bool
     84 	// 9           10
     85 	*f(), p1 = m[gint()]
     86 	// 11          12
     87 	*f(), p2 = m[gint()]
     88 	a[11] += '0'
     89 	if !p1 || p2 {
     90 		println("bad map check", i, p1, p2)
     91 		panic("fail")
     92 	}
     93 
     94 	m[13] = 'B'
     95 	//  13        14
     96 	delete(m, gint())
     97 	gbyte()
     98 	if _, present := m[13]; present {
     99 		println("bad map removal")
    100 		panic("fail")
    101 	}
    102 
    103 	c := make(chan byte, 1)
    104 	c <- 'C'
    105 	// 15          16
    106 	*f(), p1 = <-e1(c, 16)
    107 	close(c)
    108 	// 17          18
    109 	*f(), p2 = <-e1(c, 18)
    110 	a[17] += '0'
    111 	if !p1 || p2 {
    112 		println("bad chan check", i, p1, p2)
    113 		panic("fail")
    114 	}
    115 
    116 	s1 := S1{'D'}
    117 	s2 := S2{'E'}
    118 	var iv I
    119 	// 19                20
    120 	*e3(&iv, 19), p1 = e2(s1, 20).(I)
    121 	// 21                22
    122 	*e3(&iv, 21), p2 = e2(s2, 22).(I)
    123 	if !p1 || p2 {
    124 		println("bad interface check", i, p1, p2)
    125 		panic("fail")
    126 	}
    127 
    128 	s := string(a[0:i])
    129 	if s != "def   ii A 0   C 0     " {
    130 		println("bad array results:", s)
    131 		panic("fail")
    132 	}
    133 }
    134