diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 13:16:40 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 13:16:40 +0000 |
commit | 47ab3d4a42e9ab51c465c4322d2ec233f6324e6b (patch) | |
tree | a61a0ffd83f4a3def4b36e5c8e99630c559aa723 /test/fixedbugs/bug242.go | |
parent | Initial commit. (diff) | |
download | golang-1.18-upstream.tar.xz golang-1.18-upstream.zip |
Adding upstream version 1.18.10.upstream/1.18.10upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | test/fixedbugs/bug242.go | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/test/fixedbugs/bug242.go b/test/fixedbugs/bug242.go new file mode 100644 index 0000000..4791ae4 --- /dev/null +++ b/test/fixedbugs/bug242.go @@ -0,0 +1,133 @@ +// 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") + } +} |