Commit aaf40f8f authored by LE Manh Cuong's avatar LE Manh Cuong Committed by Matthew Dempsky

cmd/compile: fix maplit init panics for dynamic entry

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: default avatarKeith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 40a6d0e0
...@@ -1262,18 +1262,24 @@ func (o *Order) expr(n, lhs *Node) *Node { ...@@ -1262,18 +1262,24 @@ func (o *Order) expr(n, lhs *Node) *Node {
if r.Op != OKEY { if r.Op != OKEY {
Fatalf("OMAPLIT entry not OKEY: %v\n", r) Fatalf("OMAPLIT entry not OKEY: %v\n", r)
} }
if isStaticCompositeLiteral(r.Left) && isStaticCompositeLiteral(r.Right) {
statics = append(statics, r) if !isStaticCompositeLiteral(r.Left) || !isStaticCompositeLiteral(r.Right) {
} else { 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) dynamics = append(dynamics, r)
continue
} }
statics = append(statics, r)
} }
n.List.Set(statics) 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 { if len(dynamics) == 0 {
break break
} }
......
// 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{},
}
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