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
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
--- /dev/null
+// 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]
+}