mirror of
https://github.com/golang/go.git
synced 2026-02-06 09:50:02 +00:00
cmd/compile: don't optimize away a panicing interface comparison
We can't do direct pointer comparisons if the type is not a comparable type. Fixes #76008 Change-Id: I1687acff21832d2c2e8f3b875e7b5ec125702ef3 Reviewed-on: https://go-review.googlesource.com/c/go/+/713840 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: David Chase <drchase@google.com> Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com> Reviewed-by: Keith Randall <khr@google.com>
This commit is contained in:
parent
30c047d0d0
commit
bd4dc413cd
2 changed files with 41 additions and 4 deletions
|
|
@ -2626,7 +2626,7 @@ func rewriteStructStore(v *Value) *Value {
|
|||
|
||||
// isDirectType reports whether v represents a type
|
||||
// (a *runtime._type) whose value is stored directly in an
|
||||
// interface (i.e., is pointer or pointer-like).
|
||||
// interface (i.e., is pointer or pointer-like) and is comparable.
|
||||
func isDirectType(v *Value) bool {
|
||||
return isDirectType1(v)
|
||||
}
|
||||
|
|
@ -2639,7 +2639,8 @@ func isDirectType1(v *Value) bool {
|
|||
case OpAddr:
|
||||
lsym := v.Aux.(*obj.LSym)
|
||||
if ti := lsym.TypeInfo(); ti != nil {
|
||||
return types.IsDirectIface(ti.Type.(*types.Type))
|
||||
t := ti.Type.(*types.Type)
|
||||
return types.IsDirectIface(t) && types.IsComparable(t)
|
||||
}
|
||||
}
|
||||
return false
|
||||
|
|
@ -2656,7 +2657,7 @@ func isDirectType2(v *Value) bool {
|
|||
|
||||
// isDirectIface reports whether v represents an itab
|
||||
// (a *runtime._itab) for a type whose value is stored directly
|
||||
// in an interface (i.e., is pointer or pointer-like).
|
||||
// in an interface (i.e., is pointer or pointer-like) and is comparable.
|
||||
func isDirectIface(v *Value) bool {
|
||||
return isDirectIface1(v, 9)
|
||||
}
|
||||
|
|
@ -2672,7 +2673,8 @@ func isDirectIface1(v *Value, depth int) bool {
|
|||
case OpAddr:
|
||||
lsym := v.Aux.(*obj.LSym)
|
||||
if ii := lsym.ItabInfo(); ii != nil {
|
||||
return types.IsDirectIface(ii.Type.(*types.Type))
|
||||
t := ii.Type.(*types.Type)
|
||||
return types.IsDirectIface(t) && types.IsComparable(t)
|
||||
}
|
||||
case OpConstNil:
|
||||
// We can treat this as direct, because if the itab is
|
||||
|
|
|
|||
35
test/fixedbugs/issue76008.go
Normal file
35
test/fixedbugs/issue76008.go
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
// run
|
||||
|
||||
// Copyright 2025 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package main
|
||||
|
||||
import "runtime"
|
||||
|
||||
func main() {
|
||||
shouldPanic(func() {
|
||||
g = any(func() {}) == any(func() {})
|
||||
})
|
||||
shouldPanic(func() {
|
||||
g = any(map[int]int{}) == any(map[int]int{})
|
||||
})
|
||||
shouldPanic(func() {
|
||||
g = any([]int{}) == any([]int{})
|
||||
})
|
||||
}
|
||||
|
||||
var g bool
|
||||
|
||||
func shouldPanic(f func()) {
|
||||
defer func() {
|
||||
err := recover()
|
||||
if err == nil {
|
||||
_, _, line, _ := runtime.Caller(2)
|
||||
println("did not panic at line", line+1)
|
||||
}
|
||||
}()
|
||||
|
||||
f()
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue