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

cmd/compile: fix compiler bug for constant equality comparison

The compiler incorrectly will error when comparing a nil pointer
interface to a nil pointer of any other type. Example:
(*int)(nil) == interface{}(nil)
Will error with "gc: illegal constant expression: *int == interface {}"

Fixes #16702

Change-Id: I1a15d651df2cfca6762b1783a28b377b2e6ff8c6
Reviewed-on: https://go-review.googlesource.com/27591
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
Trey Lawrence 2016-08-23 16:43:43 -04:00 committed by Matthew Dempsky
parent 6fe1febc86
commit fc5df089da
2 changed files with 38 additions and 0 deletions

View File

@ -827,6 +827,9 @@ func evconst(n *Node) {
// check for compatible general types (numeric, string, etc) // check for compatible general types (numeric, string, etc)
if wl != wr { if wl != wr {
if wl == TINTER || wr == TINTER {
goto setfalse
}
goto illegal goto illegal
} }

View File

@ -123,9 +123,44 @@ func floats() {
assert(f == f1e3, "f == f1e3") assert(f == f1e3, "f == f1e3")
} }
func interfaces() {
var (
nilN interface{}
nilI *int
five = 5
_ = nil == interface{}(nil)
_ = interface{}(nil) == nil
)
ii := func(i1 interface{}, i2 interface{}) bool { return i1 == i2 }
ni := func(n interface{}, i int) bool { return n == i }
in := func(i int, n interface{}) bool { return i == n }
pi := func(p *int, i interface{}) bool { return p == i }
ip := func(i interface{}, p *int) bool { return i == p }
assert((interface{}(nil) == interface{}(nil)) == ii(nilN, nilN),
"for interface{}==interface{} compiler == runtime")
assert(((*int)(nil) == interface{}(nil)) == pi(nilI, nilN),
"for *int==interface{} compiler == runtime")
assert((interface{}(nil) == (*int)(nil)) == ip(nilN, nilI),
"for interface{}==*int compiler == runtime")
assert((&five == interface{}(nil)) == pi(&five, nilN),
"for interface{}==*int compiler == runtime")
assert((interface{}(nil) == &five) == ip(nilN, &five),
"for interface{}==*int compiler == runtime")
assert((5 == interface{}(5)) == ni(five, five),
"for int==interface{} compiler == runtime")
assert((interface{}(5) == 5) == in(five, five),
"for interface{}==int comipiler == runtime")
}
func main() { func main() {
ints() ints()
floats() floats()
interfaces()
assert(ctrue == true, "ctrue == true") assert(ctrue == true, "ctrue == true")
assert(cfalse == false, "cfalse == false") assert(cfalse == false, "cfalse == false")