From 711dacd8cf52d0c06624c4af3563d3b728c50b57 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Tue, 21 Jun 2022 11:31:11 -0700 Subject: [PATCH] [dev.unified] cmd/compile/internal/noder: implicit conversion of call arguments Function call arguments need to be implicitly converted to their respective parameter types. This CL updates the Unified IR writer to handle this case, at least for typical function calls. I'll handle f(g()) calls is a subsequent CL. Change-Id: I7c031d21f57885c9516eaf89eca517977bf9e39a Reviewed-on: https://go-review.googlesource.com/c/go/+/413514 Reviewed-by: Keith Randall Reviewed-by: David Chase Run-TryBot: Matthew Dempsky TryBot-Result: Gopher Robot --- src/cmd/compile/internal/noder/writer.go | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/cmd/compile/internal/noder/writer.go b/src/cmd/compile/internal/noder/writer.go index e773b8973dc68..5160cfaac68d5 100644 --- a/src/cmd/compile/internal/noder/writer.go +++ b/src/cmd/compile/internal/noder/writer.go @@ -1519,6 +1519,9 @@ func (w *writer) expr(expr syntax.Expr) { w.Bool(false) // not a method call (i.e., normal function call) } + sigType := types2.CoreType(tv.Type).(*types2.Signature) + paramTypes := sigType.Params() + w.Code(exprCall) writeFunExpr() w.pos(expr) @@ -1527,7 +1530,20 @@ func (w *writer) expr(expr syntax.Expr) { assert(!expr.HasDots) w.expr(expr.ArgList[0]) // TODO(mdempsky): Implicit conversions to parameter types. } else { - w.exprs(expr.ArgList) // TODO(mdempsky): Implicit conversions to parameter types. + // Like w.exprs(expr.ArgList), but with implicit conversions to parameter types. + args := expr.ArgList + w.Sync(pkgbits.SyncExprs) + w.Len(len(args)) + for i, arg := range args { + var paramType types2.Type + if sigType.Variadic() && !expr.HasDots && i+1 >= paramTypes.Len() { + paramType = paramTypes.At(paramTypes.Len() - 1).Type().(*types2.Slice).Elem() + } else { + paramType = paramTypes.At(i).Type() + } + w.implicitExpr(expr, paramType, arg) + } + w.Bool(expr.HasDots) } }