]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: unwrap fewer CONVNOPs in staticassign
authorJosh Bleecher Snyder <josharian@gmail.com>
Thu, 15 Sep 2016 03:07:13 +0000 (20:07 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Thu, 15 Sep 2016 14:08:10 +0000 (14:08 +0000)
staticassign unwraps all CONVNOPs.
However, in the included test, we need the
CONVNOP for everything to typecheck.
Stop unwrapping unnecessarily.

The code we generate for this example is
suboptimal, but that's not new; see #17113.

Fixes #17111.

Change-Id: I29532787a074a6fe19a5cc53271eb9c84bf1b576
Reviewed-on: https://go-review.googlesource.com/29213
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/gc/sinit.go
test/fixedbugs/issue17111.go [new file with mode: 0644]

index 8ca0acde51544556f839a252d64cf7f4116d2562..5dcb29ea05bf2328aa475085bb7fd7e17a6cf125 100644 (file)
@@ -286,7 +286,7 @@ func staticcopy(l *Node, r *Node, out *[]*Node) bool {
        orig := r
        r = r.Name.Defn.Right
 
-       for r.Op == OCONVNOP {
+       for r.Op == OCONVNOP && !Eqtype(r.Type, l.Type) {
                r = r.Left
        }
 
diff --git a/test/fixedbugs/issue17111.go b/test/fixedbugs/issue17111.go
new file mode 100644 (file)
index 0000000..05284a7
--- /dev/null
@@ -0,0 +1,16 @@
+// compile
+
+// Copyright 2016 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
+
+type I int
+
+var (
+       i int
+       x = I(i)
+
+       e interface{} = x
+)