Commit 34585ba5 authored by Robert Griesemer's avatar Robert Griesemer

go/types: fix unsymmetric test when typechecking comparisons

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: 's avatarMatthew Dempsky <mdempsky@google.com>
parent ff99a61e
......@@ -590,10 +590,10 @@ func (check *Checker) comparison(x, y *operand, op token.Token) {
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()
}
......
......@@ -208,6 +208,19 @@ func interfaces() {
_ = 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() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment