From: Robert Griesemer Date: Wed, 27 Jun 2018 22:38:29 +0000 (-0700) Subject: cmd/compile: don't crash in untyped expr to interface conversion X-Git-Tag: go1.11beta2~258 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=b410ce750e08f3b62af3d3d277fa0793f11ed674;p=gostls13.git cmd/compile: don't crash in untyped expr to interface conversion Fixes #24763. Change-Id: Ibe534271d75b6961d00ebfd7d42c43a3ac650d79 Reviewed-on: https://go-review.googlesource.com/121335 Reviewed-by: Matthew Dempsky --- diff --git a/src/cmd/compile/internal/gc/const.go b/src/cmd/compile/internal/gc/const.go index 8d841b94dd..2827543e31 100644 --- a/src/cmd/compile/internal/gc/const.go +++ b/src/cmd/compile/internal/gc/const.go @@ -243,15 +243,20 @@ func convlit1(n *Node, t *types.Type, explicit bool, reuse canReuseNode) *Node { n.Type = t } - if n.Type.Etype == TIDEAL { - n.Left = convlit(n.Left, t) - n.Right = convlit(n.Right, t) - n.Type = t + if n.Type.IsUntyped() { + if t.IsInterface() { + n.Left, n.Right = defaultlit2(n.Left, n.Right, true) + n.Type = n.Left.Type // same as n.Right.Type per defaultlit2 + } else { + n.Left = convlit(n.Left, t) + n.Right = convlit(n.Right, t) + n.Type = t + } } return n - // target is invalid type for a constant? leave alone. + // target is invalid type for a constant? leave alone. case OLITERAL: if !okforconst[t.Etype] && n.Type.Etype != TNIL { return defaultlitreuse(n, nil, reuse) @@ -294,7 +299,7 @@ func convlit1(n *Node, t *types.Type, explicit bool, reuse canReuseNode) *Node { return n } - // avoided repeated calculations, errors + // avoid repeated calculations, errors if eqtype(n.Type, t) { return n } @@ -1266,7 +1271,6 @@ func idealkind(n *Node) Ctype { OOR, OPLUS: k1 := idealkind(n.Left) - k2 := idealkind(n.Right) if k1 > k2 { return k1 diff --git a/test/fixedbugs/issue24763.go b/test/fixedbugs/issue24763.go new file mode 100644 index 0000000000..623ab489e8 --- /dev/null +++ b/test/fixedbugs/issue24763.go @@ -0,0 +1,21 @@ +// run + +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +func main() { + var s uint + var x = interface{}(1<