From c97af0036b8cd8ab2a7ed3f68c3ba72968637e4d Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Mon, 25 Jan 2021 17:26:07 -0800 Subject: [PATCH] [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 Trust: Matthew Dempsky Reviewed-by: Robert Griesemer --- src/cmd/compile/internal/noder/decl.go | 19 ++++++++++++++++++- test/fixedbugs/issue11945.go | 4 ++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/cmd/compile/internal/noder/decl.go b/src/cmd/compile/internal/noder/decl.go index c41b77c100..9862f452fd 100644 --- a/src/cmd/compile/internal/noder/decl.go +++ b/src/cmd/compile/internal/noder/decl.go @@ -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)) } } diff --git a/test/fixedbugs/issue11945.go b/test/fixedbugs/issue11945.go index 510b6555c6..218d07a693 100644 --- a/test/fixedbugs/issue11945.go +++ b/test/fixedbugs/issue11945.go @@ -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)