aboutsummaryrefslogtreecommitdiff
path: root/src/cmd
diff options
context:
space:
mode:
authorMatthew Dempsky <mdempsky@google.com>2022-06-30 19:16:23 -0700
committerMatthew Dempsky <mdempsky@google.com>2022-07-19 23:03:03 +0000
commitc846fd8e136dce06b213cae1cf3b9ada423c078a (patch)
treefa0c60f56262bb45a5d83b8804ddefd37f6e44e8 /src/cmd
parentebd34e3e4500b3feef4b4f98526ae95172cd8088 (diff)
downloadgo-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')
-rw-r--r--src/cmd/compile/internal/noder/writer.go22
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]