]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: preserve type information in inrange
authorJosh Bleecher Snyder <josharian@gmail.com>
Mon, 24 Oct 2016 22:36:26 +0000 (15:36 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Mon, 24 Oct 2016 22:57:21 +0000 (22:57 +0000)
Fixes #17551.

Change-Id: I84b7d82654cda3559c119aa56b07f30d0d224865
Reviewed-on: https://go-review.googlesource.com/31857
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/gc/walk.go
test/fixedbugs/issue17551.go [new file with mode: 0644]

index 6a00287b2d40ee0252a01a4262742208c66680aa..da43781212c7470b4c8876432f827e89cd78127e 100644 (file)
@@ -3561,7 +3561,10 @@ func walkinrange(n *Node, init *Nodes) *Node {
        cmp.Lineno = n.Lineno
        cmp = addinit(cmp, l.Ninit.Slice())
        cmp = addinit(cmp, r.Ninit.Slice())
+       // Typecheck the AST rooted at cmp...
        cmp = typecheck(cmp, Erv)
+       // ...but then reset cmp's type to match n's type.
+       cmp.Type = n.Type
        cmp = walkexpr(cmp, init)
        return cmp
 }
diff --git a/test/fixedbugs/issue17551.go b/test/fixedbugs/issue17551.go
new file mode 100644 (file)
index 0000000..b8751ab
--- /dev/null
@@ -0,0 +1,21 @@
+// compile
+
+// Copyright 2016 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.
+
+// Issue 17551: inrange optimization failed to preserve type information.
+
+package main
+
+import "fmt"
+
+func main() {
+       _, x := X()
+       fmt.Printf("x = %v\n", x)
+}
+
+func X() (i int, ok bool) {
+       ii := int(1)
+       return ii, 0 <= ii && ii <= 0x7fffffff
+}