1
0
mirror of https://github.com/golang/go synced 2024-11-06 16:36:20 -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 { switch op {
case token.EQL, token.NEQ: case token.EQL, token.NEQ:
// spec: "The equality operators == and != apply to operands that are comparable." // 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: case token.LSS, token.LEQ, token.GTR, token.GEQ:
// spec: The ordering operators <, <=, >, and >= apply to operands that are ordered." // spec: The ordering operators <, <=, >, and >= apply to operands that are ordered."
defined = isOrdered(x.typ) defined = isOrdered(x.typ) && isOrdered(y.typ)
default: default:
unreachable() unreachable()
} }

View File

@ -208,6 +208,19 @@ func interfaces() {
_ = i /* ERROR mismatched types */ == s2 _ = i /* ERROR mismatched types */ == s2
_ = 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() { func slices() {