The existing code assumed that comparability and orderedness
was implied for the 2nd operand if the 1st operand satisfied
these predicates.
Fixes #28164.
Change-Id: I61d4e5eedb3297731a20a14acb3645d11b36fcc5
Reviewed-on: https://go-review.googlesource.com/c/143277
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
switch op {
case token.EQL, token.NEQ:
// spec: "The equality operators == and != apply to operands that are comparable."
- defined = Comparable(x.typ) || x.isNil() && hasNil(y.typ) || y.isNil() && hasNil(x.typ)
+ defined = Comparable(x.typ) && Comparable(y.typ) || x.isNil() && hasNil(y.typ) || y.isNil() && hasNil(x.typ)
case token.LSS, token.LEQ, token.GTR, token.GEQ:
// spec: The ordering operators <, <=, >, and >= apply to operands that are ordered."
- defined = isOrdered(x.typ)
+ defined = isOrdered(x.typ) && isOrdered(y.typ)
default:
unreachable()
}
_ = i /* ERROR mismatched types */ == s2
_ = i /* ERROR mismatched types */ == &s2
+
+ // issue #28164
+ // testcase from issue
+ _ = interface /* ERROR cannot compare */ {}(nil) == []int(nil)
+
+ // related cases
+ var e interface{}
+ var s []int
+ var x int
+ _ = e /* ERROR cannot compare */ == s
+ _ = s /* ERROR cannot compare */ == e
+ _ = e /* ERROR cannot compare */ < x
+ _ = x /* ERROR cannot compare */ < e
}
func slices() {