Commit 7fa195c1 authored by Matthew Dempsky's avatar Matthew Dempsky

cmd/compile: fix false positives in isGoConst

isGoConst could spuriously return true for variables that shadow a
constant declaration with the same name.

Because even named constants are always represented by OLITERAL nodes,
the easy fix is to just ignore ONAME nodes in isGoConst. We can
similarly ignore ONONAME nodes.

Confirmed that k8s.io/kubernetes/test/e2e/storage builds again with
this fix.

Fixes #30430.

Change-Id: I899400d749982d341dc248a7cd5a18277c2795ec
Reviewed-on: https://go-review.googlesource.com/c/164319
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
parent b47f31f6
...@@ -1280,8 +1280,6 @@ func indexconst(n *Node) int64 { ...@@ -1280,8 +1280,6 @@ func indexconst(n *Node) int64 {
// //
// Expressions derived from nil, like string([]byte(nil)), while they // Expressions derived from nil, like string([]byte(nil)), while they
// may be known at compile time, are not Go language constants. // may be known at compile time, are not Go language constants.
// Only called for expressions known to evaluate to compile-time
// constants.
func (n *Node) isGoConst() bool { func (n *Node) isGoConst() bool {
if n.Orig != nil { if n.Orig != nil {
n = n.Orig n = n.Orig
...@@ -1359,17 +1357,6 @@ func (n *Node) isGoConst() bool { ...@@ -1359,17 +1357,6 @@ func (n *Node) isGoConst() bool {
return true return true
} }
case ONAME:
l := asNode(n.Sym.Def)
if l != nil && l.Op == OLITERAL && n.Val().Ctype() != CTNIL {
return true
}
case ONONAME:
if asNode(n.Sym.Def) != nil && asNode(n.Sym.Def).Op == OIOTA {
return true
}
case OALIGNOF, OOFFSETOF, OSIZEOF: case OALIGNOF, OOFFSETOF, OSIZEOF:
return true return true
} }
......
// 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.
// Issue 30430: isGoConst returned true for non-const variables,
// resulting in ICE.
package p
func f() {
var s string
_ = map[string]string{s: ""}
}
const 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