aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/walk/compare.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/compile/internal/walk/compare.go')
-rw-r--r--src/cmd/compile/internal/walk/compare.go15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/cmd/compile/internal/walk/compare.go b/src/cmd/compile/internal/walk/compare.go
index d3a91f30b9..46adbce3fd 100644
--- a/src/cmd/compile/internal/walk/compare.go
+++ b/src/cmd/compile/internal/walk/compare.go
@@ -190,20 +190,25 @@ func walkCompare(n *ir.BinaryExpr, init *ir.Nodes) ir.Node {
// a struct/array containing a non-memory field/element.
// Small memory is handled inline, and single non-memory
// is handled by walkCompare.
- fn, needsLength := reflectdata.EqFor(t)
+ fn, needsLength, ptrType := reflectdata.EqFor(t)
call := ir.NewCallExpr(base.Pos, ir.OCALL, fn, nil)
- addrCmpl := typecheck.NodAddr(cmpl)
+ addrCmpL := typecheck.NodAddr(cmpl)
addrCmpR := typecheck.NodAddr(cmpr)
if !types.IsNoRacePkg(types.LocalPkg) && base.Flag.Race {
- ptrL := typecheck.Conv(typecheck.Conv(addrCmpl, types.Types[types.TUNSAFEPTR]), types.Types[types.TUINTPTR])
+ ptrL := typecheck.Conv(typecheck.Conv(addrCmpL, types.Types[types.TUNSAFEPTR]), types.Types[types.TUINTPTR])
ptrR := typecheck.Conv(typecheck.Conv(addrCmpR, types.Types[types.TUNSAFEPTR]), types.Types[types.TUINTPTR])
raceFn := typecheck.LookupRuntime("racereadrange")
size := ir.NewInt(base.Pos, t.Size())
call.PtrInit().Append(mkcall1(raceFn, nil, init, ptrL, size))
call.PtrInit().Append(mkcall1(raceFn, nil, init, ptrR, size))
}
- call.Args.Append(addrCmpl)
- call.Args.Append(addrCmpR)
+ if ptrType != t.PtrTo() {
+ call.Args.Append(typecheck.Conv(typecheck.Conv(addrCmpL, types.Types[types.TUNSAFEPTR]), ptrType))
+ call.Args.Append(typecheck.Conv(typecheck.Conv(addrCmpR, types.Types[types.TUNSAFEPTR]), ptrType))
+ } else {
+ call.Args.Append(addrCmpL)
+ call.Args.Append(addrCmpR)
+ }
if needsLength {
call.Args.Append(ir.NewInt(base.Pos, t.Size()))
}