aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal
diff options
context:
space:
mode:
authorMatthew Dempsky <mdempsky@google.com>2023-08-24 17:05:50 -0700
committerGopher Robot <gobot@golang.org>2023-08-25 16:39:04 +0000
commitb036d7e17f1cf5ecf9411e604fbc5bb40dc3dc95 (patch)
tree514ede18b2e45ac7fc7e5b0593c3d27dca3bbc11 /src/cmd/compile/internal
parent99ea5b9765dc79e8d8f7e37bd55d6ab949eb739c (diff)
downloadgo-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/cmd/compile/internal')
-rw-r--r--src/cmd/compile/internal/noder/helpers.go2
-rw-r--r--src/cmd/compile/internal/typecheck/const.go11
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() {