1
0
mirror of https://github.com/golang/go synced 2024-11-18 22:44:48 -07:00

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>
This commit is contained in:
Matthew Dempsky 2023-08-24 17:05:50 -07:00 committed by Gopher Robot
parent 99ea5b9765
commit b036d7e17f
2 changed files with 7 additions and 6 deletions

View File

@ -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

View File

@ -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() {