mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[dev.typeparams] cmd/compile: add and use ir.RawOrigExpr
This CL adds ir.RawOrigExpr, which can be used to represent arbitrary constant expressions without needing to build and carry around an entire IR representation of the original expression. It also allows distinguishing how the constant was originally written by the user (e.g., "0xff" vs "255"). This CL then also updates irgen to make use of this functionality for expressions that were constant folded by types2. Change-Id: I41e04e228e715ae2735c357b75633a2d08ee7021 Reviewed-on: https://go-review.googlesource.com/c/go/+/323210 Trust: Matthew Dempsky <mdempsky@google.com> Trust: Robert Griesemer <gri@golang.org> Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org> Reviewed-by: Dan Scales <danscales@google.com>
This commit is contained in:
parent
de5d1aca5e
commit
ea522bc546
6 changed files with 107 additions and 7 deletions
|
|
@ -43,6 +43,32 @@ func Const(pos src.XPos, typ *types.Type, val constant.Value) ir.Node {
|
|||
return typed(typ, ir.NewBasicLit(pos, val))
|
||||
}
|
||||
|
||||
func OrigConst(pos src.XPos, typ *types.Type, val constant.Value, op ir.Op, raw string) ir.Node {
|
||||
orig := ir.NewRawOrigExpr(pos, op, raw)
|
||||
return ir.NewConstExpr(val, typed(typ, orig))
|
||||
}
|
||||
|
||||
// FixValue returns val after converting and truncating it as
|
||||
// appropriate for typ.
|
||||
func FixValue(typ *types.Type, val constant.Value) constant.Value {
|
||||
assert(typ.Kind() != types.TFORW)
|
||||
switch {
|
||||
case typ.IsInteger():
|
||||
val = constant.ToInt(val)
|
||||
case typ.IsFloat():
|
||||
val = constant.ToFloat(val)
|
||||
case typ.IsComplex():
|
||||
val = constant.ToComplex(val)
|
||||
}
|
||||
if !typ.IsUntyped() {
|
||||
val = typecheck.DefaultLit(ir.NewBasicLit(src.NoXPos, val), typ).Val()
|
||||
}
|
||||
if typ.Kind() != types.TTYPEPARAM {
|
||||
ir.AssertValidTypeForConst(typ, val)
|
||||
}
|
||||
return val
|
||||
}
|
||||
|
||||
func Nil(pos src.XPos, typ *types.Type) ir.Node {
|
||||
return typed(typ, ir.NewNilExpr(pos))
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue