1
0
mirror of https://github.com/golang/go synced 2024-11-06 14:26:22 -07:00

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: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
Robert Griesemer 2018-10-18 17:39:35 -07:00
parent ff99a61e5e
commit 34585ba51e
2 changed files with 15 additions and 2 deletions

View File

@ -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()
}

View File

@ -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() {