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:
parent
ff99a61e5e
commit
34585ba51e
@ -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()
|
||||
}
|
||||
|
13
src/go/types/testdata/expr2.src
vendored
13
src/go/types/testdata/expr2.src
vendored
@ -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() {
|
||||
|
Loading…
Reference in New Issue
Block a user