]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix maplit init panics for dynamic entry
authorLE Manh Cuong <cuong.manhle.vn@gmail.com>
Wed, 1 May 2019 14:57:52 +0000 (21:57 +0700)
committerMatthew Dempsky <mdempsky@google.com>
Wed, 1 May 2019 21:14:28 +0000 (21:14 +0000)
golang.org/cl/174498 removes dynamic map entry handling in maplit, by
filtering the static entry only. It panics if it see a dynamic entry.
It relies on order to remove all dynamic entries.

But after recursively call order on the statics, some static entries
become dynamic, e.g OCONVIFACE node:

type i interface {
j()
}
type s struct{}

func (s) j() {}

type foo map[string]i

var f = foo{
"1": s{},
}

To fix it, we recursively call order on each static entry, if it changed
to dynamic, put entry to dynamic then.

Fixes #31777

Change-Id: I1004190ac8f2d1eaa4beb6beab989db74099b025
Reviewed-on: https://go-review.googlesource.com/c/go/+/174777
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/compile/internal/gc/order.go
test/fixedbugs/issue31777.go [new file with mode: 0644]

index 54e4a15681700f4692294557d69a4aa1760d52bc..64716d84027e464f4b9cce5328f81711d63eb168 100644 (file)
@@ -1262,18 +1262,24 @@ func (o *Order) expr(n, lhs *Node) *Node {
                        if r.Op != OKEY {
                                Fatalf("OMAPLIT entry not OKEY: %v\n", r)
                        }
-                       if isStaticCompositeLiteral(r.Left) && isStaticCompositeLiteral(r.Right) {
-                               statics = append(statics, r)
-                       } else {
+
+                       if !isStaticCompositeLiteral(r.Left) || !isStaticCompositeLiteral(r.Right) {
+                               dynamics = append(dynamics, r)
+                               continue
+                       }
+
+                       // Recursively ordering some static entries can change them to dynamic;
+                       // e.g., OCONVIFACE nodes. See #31777.
+                       r = o.expr(r, nil)
+                       if !isStaticCompositeLiteral(r.Left) || !isStaticCompositeLiteral(r.Right) {
                                dynamics = append(dynamics, r)
+                               continue
                        }
+
+                       statics = append(statics, r)
                }
                n.List.Set(statics)
 
-               // Note: we don't need to recursively call order on the statics.
-               // But do it anyway, just in case that's not true in the future.
-               o.exprList(n.List)
-
                if len(dynamics) == 0 {
                        break
                }
diff --git a/test/fixedbugs/issue31777.go b/test/fixedbugs/issue31777.go
new file mode 100644 (file)
index 0000000..839e242
--- /dev/null
@@ -0,0 +1,24 @@
+// compile
+
+// Copyright 2019 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.
+
+// Compile with static map literal.
+
+package p
+
+type i interface {
+       j()
+}
+
+type s struct{}
+
+func (s) j() {}
+
+type foo map[string]i
+
+var f = foo{
+       "1": s{},
+       "2": s{},
+}