github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/cmd/compile/loopvar/testdata/range_esc_method.go (about)

     1  // Copyright 2023 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package main
     6  
     7  import (
     8  	"fmt"
     9  	"os"
    10  )
    11  
    12  type I int
    13  
    14  func (x *I) method() int {
    15  	return int(*x)
    16  }
    17  
    18  var ints = []I{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    19  
    20  func main() {
    21  	sum := 0
    22  	var is []func() int
    23  	for _, i := range ints {
    24  		for j := 0; j < 10; j++ {
    25  			if int(i) == j { // 10 skips
    26  				continue
    27  			}
    28  			sum++
    29  		}
    30  		if i&1 == 0 {
    31  			is = append(is, i.method)
    32  		}
    33  	}
    34  
    35  	bug := false
    36  	if sum != 100-10 {
    37  		fmt.Printf("wrong sum, expected %d, saw %d\n", 90, sum)
    38  		bug = true
    39  	}
    40  	sum = 0
    41  	for _, m := range is {
    42  		sum += m()
    43  	}
    44  	if sum != 2+4+6+8 {
    45  		fmt.Printf("wrong sum, expected %d, saw %d\n", 20, sum)
    46  		bug = true
    47  	}
    48  	if !bug {
    49  		fmt.Printf("PASS\n")
    50  	} else {
    51  		os.Exit(11)
    52  	}
    53  }