diff options
| author | Keith Randall <khr@golang.org> | 2025-10-22 10:13:44 -0700 |
|---|---|---|
| committer | Keith Randall <khr@golang.org> | 2025-10-28 10:24:14 -0700 |
| commit | bd4dc413cd80d3c160e875686e1be1eae5d48d4b (patch) | |
| tree | 5bcdfde599c4c70d7bc9d8e799cba84addb4021d /src/cmd | |
| parent | 30c047d0d06cdbc2983e86daaa3b0bc1afb86706 (diff) | |
| download | go-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')
| -rw-r--r-- | src/cmd/compile/internal/ssa/rewrite.go | 10 |
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 |
