1
0
mirror of https://github.com/golang/go synced 2024-11-23 08:30:05 -07:00

cmd/compile: preserve type information in inrange

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>
This commit is contained in:
Josh Bleecher Snyder 2016-10-24 15:36:26 -07:00
parent b55cee1893
commit 93bca632d9
2 changed files with 24 additions and 0 deletions

View File

@ -3561,7 +3561,10 @@ func walkinrange(n *Node, init *Nodes) *Node {
cmp.Lineno = n.Lineno cmp.Lineno = n.Lineno
cmp = addinit(cmp, l.Ninit.Slice()) cmp = addinit(cmp, l.Ninit.Slice())
cmp = addinit(cmp, r.Ninit.Slice()) cmp = addinit(cmp, r.Ninit.Slice())
// Typecheck the AST rooted at cmp...
cmp = typecheck(cmp, Erv) cmp = typecheck(cmp, Erv)
// ...but then reset cmp's type to match n's type.
cmp.Type = n.Type
cmp = walkexpr(cmp, init) cmp = walkexpr(cmp, init)
return cmp return cmp
} }

View File

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