From b036d7e17f1cf5ecf9411e604fbc5bb40dc3dc95 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Thu, 24 Aug 2023 17:05:50 -0700 Subject: [PATCH] cmd/compile/internal/noder: avoid ir.Node temps in FixValue Instead of constructing an untyped basic literal IR node, having typecheck convert it and return a new one, only to extract the constant.Value; just have typecheck export the underlying value conversion function, so we can call it directly. Change-Id: Ie98f5362b3926a728d80262b0274a0b4fd023eaf Reviewed-on: https://go-review.googlesource.com/c/go/+/522878 TryBot-Result: Gopher Robot Reviewed-by: Keith Randall Reviewed-by: Cuong Manh Le Auto-Submit: Matthew Dempsky Run-TryBot: Matthew Dempsky --- src/cmd/compile/internal/noder/helpers.go | 2 +- src/cmd/compile/internal/typecheck/const.go | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/cmd/compile/internal/noder/helpers.go b/src/cmd/compile/internal/noder/helpers.go index 5349db3879..8aa93ef5dc 100644 --- a/src/cmd/compile/internal/noder/helpers.go +++ b/src/cmd/compile/internal/noder/helpers.go @@ -58,7 +58,7 @@ func FixValue(typ *types.Type, val constant.Value) constant.Value { val = constant.ToComplex(val) } if !typ.IsUntyped() { - val = typecheck.DefaultLit(ir.NewBasicLit(src.NoXPos, val), typ).Val() + val = typecheck.ConvertVal(val, typ, false) } ir.AssertValidTypeForConst(typ, val) return val diff --git a/src/cmd/compile/internal/typecheck/const.go b/src/cmd/compile/internal/typecheck/const.go index 7ef913236e..2ac489aeef 100644 --- a/src/cmd/compile/internal/typecheck/const.go +++ b/src/cmd/compile/internal/typecheck/const.go @@ -113,7 +113,7 @@ func convlit1(n ir.Node, t *types.Type, explicit bool, context func() string) ir base.Fatalf("unexpected untyped expression: %v", n) case ir.OLITERAL: - v := convertVal(n.Val(), t, explicit) + v := ConvertVal(n.Val(), t, explicit) if v.Kind() == constant.Unknown { n = ir.NewConstExpr(n.Val(), n) break @@ -219,12 +219,13 @@ func operandType(op ir.Op, t *types.Type) *types.Type { return nil } -// convertVal converts v into a representation appropriate for t. If -// no such representation exists, it returns Val{} instead. +// ConvertVal converts v into a representation appropriate for t. If +// no such representation exists, it returns constant.MakeUnknown() +// instead. // // If explicit is true, then conversions from integer to string are // also allowed. -func convertVal(v constant.Value, t *types.Type, explicit bool) constant.Value { +func ConvertVal(v constant.Value, t *types.Type, explicit bool) constant.Value { switch ct := v.Kind(); ct { case constant.Bool: if t.IsBoolean() { @@ -344,7 +345,7 @@ var overflowNames = [...]string{ // OrigConst returns an OLITERAL with orig n and value v. func OrigConst(n ir.Node, v constant.Value) ir.Node { lno := ir.SetPos(n) - v = convertVal(v, n.Type(), false) + v = ConvertVal(v, n.Type(), false) base.Pos = lno switch v.Kind() { -- 2.48.1