diff options
Diffstat (limited to 'src/cmd/compile/internal/walk/compare.go')
| -rw-r--r-- | src/cmd/compile/internal/walk/compare.go | 15 |
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())) } |
