From: Matthew Dempsky Date: Fri, 1 Jul 2022 02:16:23 +0000 (-0700) Subject: [dev.unified] cmd/compile/internal/noder: implicit conversions for binary exprs X-Git-Tag: go1.20rc1~1807^2~22 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=c846fd8e13;p=gostls13.git [dev.unified] cmd/compile/internal/noder: implicit conversions for binary exprs Binary operations (except for shifts) require one operand to be assignable to the other's type. In particular, for equality comparisons, this can imply a conversion to interface type. Change-Id: Ic973c8287a40fdaefcf11458378574fdcd243b17 Reviewed-on: https://go-review.googlesource.com/c/go/+/415577 Run-TryBot: Matthew Dempsky TryBot-Result: Gopher Robot Reviewed-by: David Chase Reviewed-by: Cuong Manh Le --- diff --git a/src/cmd/compile/internal/noder/writer.go b/src/cmd/compile/internal/noder/writer.go index 7830b94cd8..6036695de1 100644 --- a/src/cmd/compile/internal/noder/writer.go +++ b/src/cmd/compile/internal/noder/writer.go @@ -1499,12 +1499,28 @@ func (w *writer) expr(expr syntax.Expr) { break } - // TODO(mdempsky): Implicit conversions to common type. + var commonType types2.Type + switch expr.Op { + case syntax.Shl, syntax.Shr: + // ok: operands are allowed to have different types + default: + xtyp := w.p.typeOf(expr.X) + ytyp := w.p.typeOf(expr.Y) + switch { + case types2.AssignableTo(xtyp, ytyp): + commonType = ytyp + case types2.AssignableTo(ytyp, xtyp): + commonType = xtyp + default: + w.p.fatalf(expr, "failed to find common type between %v and %v", xtyp, ytyp) + } + } + w.Code(exprBinaryOp) w.op(binOps[expr.Op]) - w.expr(expr.X) + w.implicitConvExpr(expr, commonType, expr.X) w.pos(expr) - w.expr(expr.Y) + w.implicitConvExpr(expr, commonType, expr.Y) case *syntax.CallExpr: tv, ok := w.p.info.Types[expr.Fun]