// Copyright 2023 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.
//go:build go1.22
package main
func main() {
test_init()
// Clones from cmd/compile/internal/loopvar/testdata .
range_esc_address()
range_esc_closure()
range_esc_method()
}
// After go1.22, each i will have a distinct address.
var distinct = func(a [3]int) []*int {
var r []*int
for i := range a {
r = append(r, &i)
}
return r
}([3]int{})
func test_init() {
if len(distinct) != 3 {
panic(distinct)
}
for i := 0; i < 3; i++ {
if i != *(distinct[i]) {
panic(distinct)
}
}
}
func range_esc_address() {
// Clone of range_esc_address.go
ints := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
sum := 0
var is []*int
for _, i := range ints {
for j := 0; j < 10; j++ {
if i == j { // 10 skips
continue
}
sum++
}
if i&1 == 0 {
is = append(is, &i)
}
}
bug := false
if sum != 100-10 {
println("wrong sum, expected", 90, ", saw ", sum)
bug = true
}
if len(is) != 5 {
println("wrong iterations, expected ", 5, ", saw", len(is))
bug = true
}
sum = 0
for _, pi := range is {
sum += *pi
}
if sum != 0+2+4+6+8 {
println("wrong sum, expected", 20, ", saw", sum)
bug = true
}
if bug {
panic("range_esc_address")
}
}
func range_esc_closure() {
// Clone of range_esc_closure.go
var ints = []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
var is []func() int
sum := 0
for _, i := range ints {
for j := 0; j < 10; j++ {
if i == j { // 10 skips
continue
}
sum++
}
if i&1 == 0 {
is = append(is, func() int {
if i%17 == 15 {
i++
}
return i
})
}
}
bug := false
if sum != 100-10 {
println("wrong sum, expected", 90, ", saw", sum)
bug = true
}
if len(is) != 5 {
println("wrong iterations, expected ", 5, ", saw", len(is))
bug = true
}
sum = 0
for _, f := range is {
sum += f()
}
if sum != 0+2+4+6+8 {
println("wrong sum, expected ", 20, ", saw ", sum)
bug = true
}
if bug {
panic("range_esc_closure")
}
}
type I int
func (x *I) method() int {
return int(*x)
}
func range_esc_method() {
// Clone of range_esc_method.go
var ints = []I{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
sum := 0
var is []func() int
for _, i := range ints {
for j := 0; j < 10; j++ {
if int(i) == j { // 10 skips
continue
}
sum++
}
if i&1 == 0 {
is = append(is, i.method)
}
}
bug := false
if sum != 100-10 {
println("wrong sum, expected", 90, ", saw", sum)
bug = true
}
if len(is) != 5 {
println("wrong iterations, expected ", 5, ", saw", len(is))
bug = true
}
sum = 0
for _, m := range is {
sum += m()
}
if sum != 0+2+4+6+8 {
println("wrong sum, expected ", 20, ", saw ", sum)
bug = true
}
if bug {
panic("range_esc_method")
}
}