Source file src/cmd/compile/internal/test/issue50182_test.go

     1  // Copyright 2021 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 test
     6  
     7  import (
     8  	"fmt"
     9  	"sort"
    10  	"testing"
    11  )
    12  
    13  // Test that calling methods on generic types doesn't cause allocations.
    14  func genericSorted[T sort.Interface](data T) bool {
    15  	n := data.Len()
    16  	for i := n - 1; i > 0; i-- {
    17  		if data.Less(i, i-1) {
    18  			return false
    19  		}
    20  	}
    21  	return true
    22  }
    23  func TestGenericSorted(t *testing.T) {
    24  	var data = sort.IntSlice{-10, -5, 0, 1, 2, 3, 5, 7, 11, 100, 100, 100, 1000, 10000}
    25  	f := func() {
    26  		genericSorted(data)
    27  	}
    28  	if n := testing.AllocsPerRun(10, f); n > 0 {
    29  		t.Errorf("got %f allocs, want 0", n)
    30  	}
    31  }
    32  
    33  // Test that escape analysis correctly tracks escaping inside of methods
    34  // called on generic types.
    35  type fooer interface {
    36  	foo()
    37  }
    38  type P struct {
    39  	p *int
    40  	q int
    41  }
    42  
    43  var esc []*int
    44  
    45  func (p P) foo() {
    46  	esc = append(esc, p.p) // foo escapes the pointer from inside of p
    47  }
    48  func f[T fooer](t T) {
    49  	t.foo()
    50  }
    51  func TestGenericEscape(t *testing.T) {
    52  	for i := 0; i < 4; i++ {
    53  		var x int = 77 + i
    54  		var p P = P{p: &x}
    55  		f(p)
    56  	}
    57  	for i, p := range esc {
    58  		if got, want := *p, 77+i; got != want {
    59  			panic(fmt.Sprintf("entry %d: got %d, want %d", i, got, want))
    60  		}
    61  	}
    62  }
    63  

View as plain text