diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index 6a00287b2d4..da43781212c 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 00000000000..b8751ab42dc --- /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 +}