diff options
| author | Matthew Dempsky <mdempsky@google.com> | 2023-08-24 17:05:50 -0700 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2023-08-25 16:39:04 +0000 |
| commit | b036d7e17f1cf5ecf9411e604fbc5bb40dc3dc95 (patch) | |
| tree | 514ede18b2e45ac7fc7e5b0593c3d27dca3bbc11 /src | |
| parent | 99ea5b9765dc79e8d8f7e37bd55d6ab949eb739c (diff) | |
| download | go-b036d7e17f1cf5ecf9411e604fbc5bb40dc3dc95.tar.xz | |
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 <gobot@golang.org>
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Auto-Submit: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmd/compile/internal/noder/helpers.go | 2 | ||||
| -rw-r--r-- | 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() { |
