Commit b410ce75 authored by Robert Griesemer's avatar Robert Griesemer

cmd/compile: don't crash in untyped expr to interface conversion

Fixes #24763.

Change-Id: Ibe534271d75b6961d00ebfd7d42c43a3ac650d79
Reviewed-on: https://go-review.googlesource.com/121335Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
parent a79fe535
...@@ -243,15 +243,20 @@ func convlit1(n *Node, t *types.Type, explicit bool, reuse canReuseNode) *Node { ...@@ -243,15 +243,20 @@ func convlit1(n *Node, t *types.Type, explicit bool, reuse canReuseNode) *Node {
n.Type = t n.Type = t
} }
if n.Type.Etype == TIDEAL { if n.Type.IsUntyped() {
n.Left = convlit(n.Left, t) if t.IsInterface() {
n.Right = convlit(n.Right, t) n.Left, n.Right = defaultlit2(n.Left, n.Right, true)
n.Type = t 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 return n
// target is invalid type for a constant? leave alone. // target is invalid type for a constant? leave alone.
case OLITERAL: case OLITERAL:
if !okforconst[t.Etype] && n.Type.Etype != TNIL { if !okforconst[t.Etype] && n.Type.Etype != TNIL {
return defaultlitreuse(n, nil, reuse) return defaultlitreuse(n, nil, reuse)
...@@ -294,7 +299,7 @@ func convlit1(n *Node, t *types.Type, explicit bool, reuse canReuseNode) *Node { ...@@ -294,7 +299,7 @@ func convlit1(n *Node, t *types.Type, explicit bool, reuse canReuseNode) *Node {
return n return n
} }
// avoided repeated calculations, errors // avoid repeated calculations, errors
if eqtype(n.Type, t) { if eqtype(n.Type, t) {
return n return n
} }
...@@ -1266,7 +1271,6 @@ func idealkind(n *Node) Ctype { ...@@ -1266,7 +1271,6 @@ func idealkind(n *Node) Ctype {
OOR, OOR,
OPLUS: OPLUS:
k1 := idealkind(n.Left) k1 := idealkind(n.Left)
k2 := idealkind(n.Right) k2 := idealkind(n.Right)
if k1 > k2 { if k1 > k2 {
return k1 return k1
......
// 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<<s + 1<<s) // compiler must not crash here
if x.(int) != 2 {
panic("x not int or not 2")
}
var y interface{}
y = 1<<s + 1 // compiler must not crash here
if y.(int) != 2 {
panic("y not int or not 2")
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment