mirror of
https://github.com/golang/go
synced 2024-11-22 20:40:03 -07:00
[dev.typeparams] cmd/compile: force untyped constants from types2 to expected kind
Currently, types2 sometimes produces constant.Values with a Kind different than the untyped constant type's Is{Integer,Float,Complex} info, which irgen expects to always match. While we mull how best to proceed in #43891, this CL adapts irgen to types2's current behavior. In particular, fixedbugs/issue11945.go now passes with -G=3. Updates #43891. Change-Id: I24823a32ff49af6045a032d3903dbb55cbec6bef Reviewed-on: https://go-review.googlesource.com/c/go/+/286652 Run-TryBot: Matthew Dempsky <mdempsky@google.com> Trust: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
parent
3663a437a7
commit
c97af0036b
@ -5,6 +5,8 @@
|
||||
package noder
|
||||
|
||||
import (
|
||||
"go/constant"
|
||||
|
||||
"cmd/compile/internal/base"
|
||||
"cmd/compile/internal/ir"
|
||||
"cmd/compile/internal/syntax"
|
||||
@ -58,7 +60,22 @@ func (g *irgen) constDecl(out *ir.Nodes, decl *syntax.ConstDecl) {
|
||||
|
||||
for _, name := range decl.NameList {
|
||||
name, obj := g.def(name)
|
||||
name.SetVal(obj.(*types2.Const).Val())
|
||||
|
||||
// For untyped numeric constants, make sure the value
|
||||
// representation matches what the rest of the
|
||||
// compiler (really just iexport) expects.
|
||||
// TODO(mdempsky): Revisit after #43891 is resolved.
|
||||
val := obj.(*types2.Const).Val()
|
||||
switch name.Type() {
|
||||
case types.UntypedInt, types.UntypedRune:
|
||||
val = constant.ToInt(val)
|
||||
case types.UntypedFloat:
|
||||
val = constant.ToFloat(val)
|
||||
case types.UntypedComplex:
|
||||
val = constant.ToComplex(val)
|
||||
}
|
||||
name.SetVal(val)
|
||||
|
||||
out.Append(ir.NewDecl(g.pos(decl), ir.ODCLCONST, name))
|
||||
}
|
||||
}
|
||||
|
@ -13,6 +13,10 @@ const (
|
||||
_ = real(0) // from bug report
|
||||
_ = imag(0) // from bug report
|
||||
|
||||
// same as above, but exported for #43891
|
||||
Real0 = real(0)
|
||||
Imag0 = imag(0)
|
||||
|
||||
// if the arguments are untyped, the results must be untyped
|
||||
// (and compatible with types that can represent the values)
|
||||
_ int = real(1)
|
||||
|
Loading…
Reference in New Issue
Block a user