]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.5] cmd/compile: fix Val vs Opt collision
authorRuss Cox <rsc@golang.org>
Tue, 17 Nov 2015 21:34:06 +0000 (16:34 -0500)
committerRuss Cox <rsc@golang.org>
Mon, 23 Nov 2015 01:13:04 +0000 (01:13 +0000)
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

src/cmd/compile/internal/gc/const.go
test/fixedbugs/issue12686.go [new file with mode: 0644]

index 9eb49836062094c06dcbaee51e207b1396d5662a..5095e5ebd9268082232888088e2fadfeaf86cb81 100644 (file)
@@ -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 (file)
index 0000000..5783c99
--- /dev/null
@@ -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]
+}