// 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") } }