mirror of
https://github.com/golang/go
synced 2024-11-22 14:15:05 -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)
|
||||
if wl != wr {
|
||||
if wl == TINTER || wr == TINTER {
|
||||
goto setfalse
|
||||
}
|
||||
goto illegal
|
||||
}
|
||||
|
||||
|
@ -123,9 +123,44 @@ func floats() {
|
||||
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() {
|
||||
ints()
|
||||
floats()
|
||||
interfaces()
|
||||
|
||||
assert(ctrue == true, "ctrue == true")
|
||||
assert(cfalse == false, "cfalse == false")
|
||||
|
Loading…
Reference in New Issue
Block a user