]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: don't crash in untyped expr to interface conversion
authorRobert Griesemer <gri@golang.org>
Wed, 27 Jun 2018 22:38:29 +0000 (15:38 -0700)
committerRobert Griesemer <gri@golang.org>
Thu, 28 Jun 2018 23:01:22 +0000 (23:01 +0000)
Fixes #24763.

Change-Id: Ibe534271d75b6961d00ebfd7d42c43a3ac650d79
Reviewed-on: https://go-review.googlesource.com/121335
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/gc/const.go
test/fixedbugs/issue24763.go [new file with mode: 0644]

index 8d841b94ddf5b7f5129780dd5e972a3b7a3f0751..2827543e31ebb37746a5f655be5aa2f2366ca047 100644 (file)
@@ -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 (file)
index 0000000..623ab48
--- /dev/null
@@ -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<<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")
+       }
+}