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)
return n
}
- // avoided repeated calculations, errors
+ // avoid repeated calculations, errors
if eqtype(n.Type, t) {
return n
}
OOR,
OPLUS:
k1 := idealkind(n.Left)
-
k2 := idealkind(n.Right)
if k1 > k2 {
return k1
--- /dev/null
+// 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")
+ }
+}