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>
This commit is contained in:
Russ Cox 2015-11-17 16:34:06 -05:00
parent f8e6418637
commit 918a2644f2
2 changed files with 28 additions and 4 deletions

View file

@ -1305,20 +1305,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

View file

@ -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]
}