From 004fb5cb8dd74b9ac46a9990e9a028673b88e838 Mon Sep 17 00:00:00 2001 From: LE Manh Cuong Date: Thu, 2 May 2019 03:57:29 +0700 Subject: [PATCH] cmd/compile: fix isStaticCompositeLiteral reports wrong for struct field golang.org/cl/174498 add ONAME case to isStaticCompositeLiteral, to detect global variable as compile-time constant. It does report wrong for struct field, e.g: o := one{i: two{i: 42}.i} field i in two{i: 42} was reported as static composite literal, while it should not. In general, adding ONAME case for isStaticCompositeLiteral is probably wrong. Fixes #31782 Change-Id: Icde7d43bbb002b75df5c52b948b7126a4265e07b Reviewed-on: https://go-review.googlesource.com/c/go/+/174837 Reviewed-by: Matthew Dempsky Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/sinit.go | 2 -- test/fixedbugs/issue31782.go | 24 ++++++++++++++++++++++++ test/fixedbugs/issue31782.out | 1 + 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 test/fixedbugs/issue31782.go create mode 100644 test/fixedbugs/issue31782.out diff --git a/src/cmd/compile/internal/gc/sinit.go b/src/cmd/compile/internal/gc/sinit.go index 92cf51e345..aa0c06c564 100644 --- a/src/cmd/compile/internal/gc/sinit.go +++ b/src/cmd/compile/internal/gc/sinit.go @@ -650,8 +650,6 @@ func getdyn(n *Node, top bool) initGenType { // isStaticCompositeLiteral reports whether n is a compile-time constant. func isStaticCompositeLiteral(n *Node) bool { switch n.Op { - case ONAME: - return n.Class() == PEXTERN && n.Name != nil && n.Name.Readonly() case OSLICELIT: return false case OARRAYLIT: diff --git a/test/fixedbugs/issue31782.go b/test/fixedbugs/issue31782.go new file mode 100644 index 0000000000..a42001ea0e --- /dev/null +++ b/test/fixedbugs/issue31782.go @@ -0,0 +1,24 @@ +// run + +// 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. + +// Check static composite literal reports wrong for struct +// field. + +package main + +type one struct { + i interface{} +} + +type two struct { + i interface{} + s []string +} + +func main() { + o := one{i: two{i: 42}.i} + println(o.i.(int)) +} diff --git a/test/fixedbugs/issue31782.out b/test/fixedbugs/issue31782.out new file mode 100644 index 0000000000..d81cc0710e --- /dev/null +++ b/test/fixedbugs/issue31782.out @@ -0,0 +1 @@ +42 -- 2.48.1