mirror of
https://github.com/golang/go
synced 2024-11-22 19:14:53 -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:
parent
6fe1febc86
commit
fc5df089da
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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")
|
||||||
|
Loading…
Reference in New Issue
Block a user