From 32e2ae0b18682888e4119963e932e5fbd8a1f327 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 15 Jan 2010 14:02:53 -0800 Subject: [PATCH] Test order of evaluation in tuple assignments. gccgo currently passes this test; 8g currently does not. I think I counted everything out right. R=rsc CC=golang-dev https://golang.org/cl/186165 --- test/bugs/bug242.go | 110 ++++++++++++++++++++++++++++++++++++++++++++ test/golden.out | 5 ++ 2 files changed, 115 insertions(+) create mode 100644 test/bugs/bug242.go diff --git a/test/bugs/bug242.go b/test/bugs/bug242.go new file mode 100644 index 00000000000..fe5d9a24b37 --- /dev/null +++ b/test/bugs/bug242.go @@ -0,0 +1,110 @@ +// $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] = ' ' + } + + *f(), *f(), *f() = gbyte(), gbyte(), gbyte() + + *f(), *f() = x() + + m := make(map[byte]byte) + m[10] = 'A' + var p1, p2 bool + *f(), p1 = m[gint()] + *f(), p2 = m[gint()] + if !p1 || p2 { + panicln("bad map check", i, p1, p2) + } + + m[13] = 'B' + m[gint()] = gbyte(), false + if _, present := m[13]; present { + panicln("bad map removal") + } + + c := make(chan byte, 1) + c <- 'C' + *f(), p1 = <-e1(c, 16) + *f(), p2 = <-e1(c, 18) + if !p1 || p2 { + panicln("bad chan check", i, p1, p2) + } + + s1 := S1{'D'} + s2 := S2{'E'} + var iv I + *e3(&iv, 19), p1 = e2(s1, 20).(I) + *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 C " { + panicln("bad array results:", s) + } +} diff --git a/test/golden.out b/test/golden.out index ae04f70bb3b..051bb9bc70d 100644 --- a/test/golden.out +++ b/test/golden.out @@ -144,3 +144,8 @@ throw: interface conversion panic PC=xxx == bugs/ + +=========== bugs/bug242.go +bad map check 13 false false +panic PC=xxx +BUG: tuple evaluation order