...
Run Format

Source file test/fixedbugs/bug242.go

Documentation: test/fixedbugs

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

View as plain text