aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2015-11-17 16:34:06 -0500
committerRuss Cox <rsc@golang.org>2015-11-23 01:13:04 +0000
commit29a22abfc8c81be7c3676f385fb0f2caf3029543 (patch)
tree9c80e82fcbcf47d8c56dd8891264b13ecc135c12
parent08ea82529a12506da7b329c2d0f6af57b714514a (diff)
downloadgo-29a22abfc8c81be7c3676f385fb0f2caf3029543.tar.gz
go-29a22abfc8c81be7c3676f385fb0f2caf3029543.zip
[release-branch.go1.5] cmd/compile: fix Val vs Opt collision
Fixes #12686. Change-Id: I7a9f49dbd1f60b1d0240de57787753b425f9548c Reviewed-on: https://go-review.googlesource.com/17031 Reviewed-by: Ian Lance Taylor <iant@golang.org> Reviewed-on: https://go-review.googlesource.com/17124
-rw-r--r--src/cmd/compile/internal/gc/const.go16
-rw-r--r--test/fixedbugs/issue12686.go16
2 files changed, 28 insertions, 4 deletions
diff --git a/src/cmd/compile/internal/gc/const.go b/src/cmd/compile/internal/gc/const.go
index 9eb4983606..5095e5ebd9 100644
--- a/src/cmd/compile/internal/gc/const.go
+++ b/src/cmd/compile/internal/gc/const.go
@@ -1279,20 +1279,28 @@ func defaultlit(np **Node, t *Type) {
return
num:
+ // Note: n.Val().Ctype() can be CTxxx (not a constant) here
+ // in the case of an untyped non-constant value, like 1<<i.
+ v1 := n.Val()
if t != nil {
if Isint[t.Etype] {
t1 = t
- n.SetVal(toint(n.Val()))
+ v1 = toint(n.Val())
} else if Isfloat[t.Etype] {
t1 = t
- n.SetVal(toflt(n.Val()))
+ v1 = toflt(n.Val())
} else if Iscomplex[t.Etype] {
t1 = t
- n.SetVal(tocplx(n.Val()))
+ v1 = tocplx(n.Val())
+ }
+ if n.Val().Ctype() != CTxxx {
+ n.SetVal(v1)
}
}
- overflow(n.Val(), t1)
+ if n.Val().Ctype() != CTxxx {
+ overflow(n.Val(), t1)
+ }
Convlit(np, t1)
lineno = int32(lno)
return
diff --git a/test/fixedbugs/issue12686.go b/test/fixedbugs/issue12686.go
new file mode 100644
index 0000000000..5783c99a1a
--- /dev/null
+++ b/test/fixedbugs/issue12686.go
@@ -0,0 +1,16 @@
+// compile
+
+// Copyright 2015 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.
+
+// golang.org/issue/12686.
+// interesting because it's a non-constant but ideal value
+// and we used to incorrectly attach a constant Val to the Node.
+
+package p
+
+func f(i uint) uint {
+ x := []uint{1 << i}
+ return x[0]
+}