blob: 8122b1d2b657268b1230d0ee66dcce3014895655 [file] [log] [blame]
// 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}},
{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()
}