// 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)
}
return false
}
if ti, ok := (*lsym.Extra).(*obj.TypeInfo); ok {
- return types.IsDirectIface(ti.Type.(*types.Type))
+ t := ti.Type.(*types.Type)
+ return types.IsDirectIface(t) && types.IsComparable(t)
}
}
return false
// 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)
}
return false
}
if ii, ok := (*lsym.Extra).(*obj.ItabInfo); ok {
- 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
--- /dev/null
+// 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()
+}