diff options
| author | Matthew Dempsky <mdempsky@google.com> | 2022-06-30 19:16:23 -0700 |
|---|---|---|
| committer | Matthew Dempsky <mdempsky@google.com> | 2022-07-19 23:03:03 +0000 |
| commit | c846fd8e136dce06b213cae1cf3b9ada423c078a (patch) | |
| tree | fa0c60f56262bb45a5d83b8804ddefd37f6e44e8 /src/cmd/compile/internal/noder | |
| parent | ebd34e3e4500b3feef4b4f98526ae95172cd8088 (diff) | |
| download | go-c846fd8e136dce06b213cae1cf3b9ada423c078a.tar.xz | |
[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 <mdempsky@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Diffstat (limited to 'src/cmd/compile/internal/noder')
| -rw-r--r-- | src/cmd/compile/internal/noder/writer.go | 22 |
1 files changed, 19 insertions, 3 deletions
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] |
