aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2025-10-22 10:13:44 -0700
committerKeith Randall <khr@golang.org>2025-10-28 10:24:14 -0700
commitbd4dc413cd80d3c160e875686e1be1eae5d48d4b (patch)
tree5bcdfde599c4c70d7bc9d8e799cba84addb4021d /src/cmd/compile/internal
parent30c047d0d06cdbc2983e86daaa3b0bc1afb86706 (diff)
downloadgo-bd4dc413cd80d3c160e875686e1be1eae5d48d4b.tar.xz
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>
Diffstat (limited to 'src/cmd/compile/internal')
-rw-r--r--src/cmd/compile/internal/ssa/rewrite.go10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/cmd/compile/internal/ssa/rewrite.go b/src/cmd/compile/internal/ssa/rewrite.go
index 16c28e1ea4..2856ff2e43 100644
--- a/src/cmd/compile/internal/ssa/rewrite.go
+++ b/src/cmd/compile/internal/ssa/rewrite.go
@@ -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