]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: test that equality is evaluated in order
authorKeith Randall <khr@golang.org>
Wed, 3 Jun 2020 17:52:23 +0000 (10:52 -0700)
committerKeith Randall <khr@golang.org>
Wed, 3 Jun 2020 19:07:55 +0000 (19:07 +0000)
Make sure that we compare fields of structs and elements of arrays in order,
with proper short-circuiting.

Update #8606

Change-Id: I0a66ad92ea0af7bcc56dfdb275dec2b8d7e8b4fe
Reviewed-on: https://go-review.googlesource.com/c/go/+/236147
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

test/fixedbugs/issue8606.go [new file with mode: 0644]

diff --git a/test/fixedbugs/issue8606.go b/test/fixedbugs/issue8606.go
new file mode 100644 (file)
index 0000000..676c06c
--- /dev/null
@@ -0,0 +1,46 @@
+// run
+
+// Copyright 2020 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.
+
+// Check to make sure that we compare fields in order. See issue 8606.
+
+package main
+
+import "fmt"
+
+func main() {
+       type A [2]interface{}
+       type S struct{ x, y interface{} }
+
+       for _, test := range []struct {
+               panic bool
+               a, b  interface{}
+       }{
+               {false, A{1, []byte{1}}, A{2, []byte{1}}},
+               {true, A{[]byte{1}, 1}, A{[]byte{1}, 2}},
+               {false, S{1, []byte{1}}, S{2, []byte{1}}},
+               {true, S{[]byte{1}, 1}, S{[]byte{1}, 2}},
+       } {
+               f := func() {
+                       if test.a == test.b {
+                               panic(fmt.Sprintf("values %#v and %#v should not be equal", test.a, test.b))
+                       }
+               }
+               if test.panic {
+                       shouldPanic(fmt.Sprintf("comparing %#v and %#v did not panic", test.a, test.b), f)
+               } else {
+                       f() // should not panic
+               }
+       }
+}
+
+func shouldPanic(name string, f func()) {
+       defer func() {
+               if recover() == nil {
+                       panic(name)
+               }
+       }()
+       f()
+}