mirror of
https://github.com/golang/go
synced 2024-09-04 23:44:16 +00:00
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:
parent
f8e6418637
commit
918a2644f2
|
@ -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
|
||||
|
|
16
test/fixedbugs/issue12686.go
Normal file
16
test/fixedbugs/issue12686.go
Normal 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]
|
||||
}
|
Loading…
Reference in a new issue