From 93bca632d9d4662c0e04f6ae24122579130a4bc2 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Mon, 24 Oct 2016 15:36:26 -0700 Subject: [PATCH] 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 TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/walk.go | 3 +++ test/fixedbugs/issue17551.go | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 test/fixedbugs/issue17551.go diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index 6a00287b2d..da43781212 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -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 index 0000000000..b8751ab42d --- /dev/null +++ b/test/fixedbugs/issue17551.go @@ -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 +}